【问题标题】:C# -- BinaryReader and Little EndianC# -- BinaryReader 和 Little Endian
【发布时间】:2014-09-26 13:56:46
【问题描述】:

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

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 线程“Is .NET BinaryReader always little-endian, even on big-endian systems?”,我应该采用“所有”LittleEndian 格式(ReadBytes 以及机器生成的文件)。 问题是函数 ByteArrayToString() 给了我这个结果: 0xF0FF 是 BigEndian 而不是 LittleEndian(事实上我想我应该收到 0xFFF0),因为在那之后我必须解码很多数据,我可以'不确定结果的一致性(我没有什么可比的),我不想解码.bin文件有问题,我怎样才能获得g 0xFFF0?

【问题讨论】:

    标签: c# binary endianness


    【解决方案1】:

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

    如果您需要特定排序的字节数组(或它的十六进制表示),您必须自己执行该排序。

    如果文件已经按照您想要的字节顺序排列,那么很可能您只是在读取错误的数据。我不会对此感到完全惊讶 - 您正在重新定位底层流,BinaryReader 可能不知道。如果它已将 16 个字节读取到其缓冲区中,则在您读取所有缓冲区之前,它可能不会再次从流中读取。我建议您将BinaryReader 排除在外,而只使用Stream - 编写您自己的ReadBytes 等价物并不难,它会简单地循环直到它用完数据或读取您需要的所有数据。

    【讨论】:

    • 乔姆,谢谢你的回答。不幸的是有些东西很奇怪......我提供的sn-p被插入到一个大项目中,我必须读取一个文件的640个扇区的签名。每个扇区都可以用 4 个值“签名”。好吧,我只能有一个由 0xFFF0 以 Little Endian 格式签名的扇区。现在其他 639 个扇区都很好,所以我读到错误的数据是完全不可能的(否则其他扇区也应该是错误的)。生成文件的工具我确定是以 LittleEndian 格式编写的。也许当我将它复制到我的机器(通过 USB)时,字节序格式会发生变化?
    • @pinguinone:这对我来说听起来不太可能。您应该使用二进制文件编辑器查看该文件以准确检查其中的内容......并且在您弄清楚实际发生的情况之前不要假设任何事情都是“完全不可能的”。
    猜你喜欢
    • 2019-06-30
    • 2018-05-15
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2012-10-09
    • 2010-10-16
    • 2018-08-09
    • 2022-06-10
    相关资源
    最近更新 更多