主题.与输入文件相比,ReadInt32结果异常,为什么?

本文关键字:ReadInt32 结果 为什么 异常 输入 文件 主题 | 更新日期: 2023-09-27 18:06:30

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

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

当使用BinaryReader迭代同一文件时,如果我先调用ReadInt32(),我将期望int值为1,382,168,593。

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

结果是288,907,858。

显然我错过了一些明显的…有人能解释一下这是怎么回事吗?

主题.与输入文件相比,ReadInt32结果异常,为什么?

BinaryReader按小端顺序读取字节

观察:

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

如果您需要指定正在读取的数据的字节顺序,我建议使用mono_dataconvert。我在几个项目中使用过它,它非常有用,而且是麻省理工学院授权的。(由于性能原因,它确实使用不安全的代码,因此您不能在不受信任的上下文中使用它。)

关于这个概念的更多信息,请参阅维基百科关于端序的文章。

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

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