BinaryReader.ReadInt32与输入文件相比意外结果,为什么?

时间:2011-08-24 21:01:05

标签: c# binaryreader

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

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

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

  

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

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

很明显,我错过了一些明显的东西......任何人都可以解释发生了什么事吗?

2 个答案:

答案 0 :(得分:11)

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

观察:

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

如果您需要指定正在阅读的数据的字节顺序,我建议您使用Mono.DataConvert。我已经在几个项目中使用它,它非常有用,以及麻省理工学院许可。 (出于性能原因,它确实使用了不安全的代码,因此您无法在不受信任的上下文中使用它。)

有关该概念的更多信息,请参阅the Wikipedia article on endianness

有关BinaryReader

的实现的详细信息,请参阅Microsoft's Reference Source

答案 1 :(得分:3)

英特尔架构为little endian。序列中的最后一个字节具有最高值。所以52 62 38 11相当于0x11386252。