C# -- BinaryReader and Little Endian

本文关键字:Little Endian and BinaryReader | 更新日期: 2023-09-27 18:24:43

我必须读取一个二进制文件,所以我使用以下代码:

static void ReadBin()
        {
            var sectors = new List<Sector>();
            using (var b = new BinaryReader(File.Open("C:''LOG.BIN", FileMode.Open)))
            {
                const int offset = 4096;
                const int required = 2;
                int pos = 0;
                var length = (int)b.BaseStream.Length;
                while (pos < length)
                {
                    for (int i = 1; i <= 640; i++)
                    {
                        pos = (offset*i)-2;
                        b.BaseStream.Seek(pos, SeekOrigin.Begin);
                        // Read the next 2 bytes.
                        byte[] by = b.ReadBytes(required);
                        sectors.Add(new Sector { Number = i, Position = pos, Type = Sector.SetTypeFromExadecimalString(ByteArrayToString(@by)) });
                        pos = pos + 2;
                    }
                }
            }
        }

正如您所看到的,ByteArrayToString获取字节数组并写入一个字符串。ByteArrayToString的代码为:

    public static string ByteArrayToString(byte[] ba)
    {
        StringBuilder hex = new StringBuilder(ba.Length * 2);
        foreach (byte b in ba)
            hex.AppendFormat("{0:x2}", b);
        return string.Format("0x{0}", hex.ToString().ToUpper());
    }

编写.bin文件的机器用LittleEndian编写。因此,在StackOverflow线程".NET BinaryReader总是小端序吗,即使在大端序系统上也是如此?"之后,我应该是"all"LittleEndian格式(ReadBytes和机器生成的文件)。问题是函数ByteArrayToString()给了我这样的结果:0xF0FF在BigEndian中,而不是在LittleEndian中(事实上,我想我应该接收0xFFF0),因为在那之后我必须解码很多数据,并且我不能确定结果的一致性(我没有什么可比较的),我不想在解码.bin文件时出现问题,如何获得0xFFF0?

C# -- BinaryReader and Little Endian

BinaryReader的endianness只影响ReadInt32等方法。它不会影响ReadBytes-它将始终按字节在流中出现的顺序返回字节。

如果在特定的排序中需要一个字节数组(或其十六进制表示),则必须自己执行该排序。

如果文件已经在您想要的endianness中,那么很可能您只是读取了错误的数据。我不会对此感到完全惊讶——您正在重新定位底层流,而BinaryReader可能没有意识到这一点。如果它已经将16个字节读取到缓冲区中,那么在您读取完所有缓冲区时,它可能不会再次从流中读取。我建议你把BinaryReader从等式中去掉,只使用Stream——写你自己的等效ReadBytes并不难,它只是循环,直到数据用完或读取你需要的所有数据。