我对特定的BinaryReader
操作感到困惑。
使用十六进制编辑器(UltraEdit)查看二进制文件时,前四个字节为:52 62 38 11
。
当使用BinaryReader
迭代同一个文件时,如果我先调用ReadInt32()
,我希望int值为1,382,168,593。
.ReadInt32()
:从当前流中读取一个4字节有符号整数,并将流的当前位置提前四个字节。
相反,我得到288,907,858。
很明显,我错过了一些明显的东西......任何人都可以解释发生了什么事吗?
答案 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。