1

我对特定的BinaryReader操作感到困惑。

使用十六进制编辑器 (UltraEdit) 查看二进制文件时,前四个字节是:52 62 38 11.

当用 a 遍历同一个文件时BinaryReader,如果我ReadInt32()先调用,我希望 int 值为 1,382,168,593。

.ReadInt32(): 从当前流中读取一个 4 字节的有符号整数,并将流的当前位置提前 4 个字节。

相反,我得到 288,907,858。

显然我错过了一些明显的东西......谁能解释发生了什么?

4

2 回答 2

12

BinaryReader以 little-endian 顺序读取字节。

观察:

csharp> 0x52623811;  // What you expected it to read.
1382168593
csharp> 0x11386252;  // What it actually read.
288907858

如果您需要指定正在读取的数据的字节顺序,我建议使用Mono.DataConvert。我已经在几个项目中使用过它,它非常有用,并且获得了 MIT 许可。(出于性能原因,它确实使用了不安全的代码,因此您不能在不受信任的上下文中使用它。)

有关该概念的更多信息,请参阅有关字节顺序的 Wikipedia 文章。

有关BinaryReader 实现的详细信息,请参见Microsoft 的参考源

于 2011-08-24T21:03:36.323 回答
3

英特尔架构是小端的。序列中的最后一个字节具有最高值。所以 52 62 38 11 等价于 0x11386252。

于 2011-08-24T21:05:07.087 回答