.net – 为什么BinaryReader.ReadUInt32()反转位模式?

栏目: ASP.NET · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/899279/why-does-binaryreader-readuint32-reverse-the-bit-pattern

我正在尝试使用BinaryReader类读取二进制文件,我需要将其作为UInt32的块读取,然后进行一些位移等等.

但是,由于某种原因,当我使用ReadUInt32方法时,位顺序是相反的.

例如,如果我有一个文件,其中前四个字节看起来像十六进制,0x12345678,它们在被ReadUInt32读取后会像这样结束:0x78563412.

如果我使用ReadBytes(4)方法,我得到预期的数组:

[0x00000000]    0x12    byte
[0x00000001]    0x34    byte
[0x00000002]    0x56    byte
[0x00000003]    0x78    byte

为什么是这样?这只是方式.net代表内存中的uint?在不同的平台上是否相同(我运行64位Windows 7,.net 3.5 sp1)?

这似乎是一个 endianness 问题. The docs

说ReadUint32以little-endian读取所以第一个字节是最不重要的,所以它进入最低的内存位置.你的作家必须是大头?

BinaryWriter.Write(UInt32) says it writes 也是little-endian.你的二进制数据源不是BinaryWriter吗?

基本上你需要做的就是修复它:

uint a = 0x12345678;
uint b = ((a & 0x000000FF) << 24) + ((a & 0x0000FF00) << 8) + ((a & 0x00FF0000) >> 8) + ((a & 0xFF000000) >> 24);

这将最低有效字节向上移位24位,第二LSB向上移位8位,第三LSB向下移位8位,第四LSB(MSB)向下移位24位.这样做包含在几个库中.

也许使用BitConverter会更清楚一些:

uint a = 0x12345678;
byte[] bytes = BitConverter.GetBytes(a);
// Swap byte order
uint b = BitConverter.ToUInt32(new byte[] { bytes[3], bytes[2], bytes[1], bytes[0] }, 0);

翻译自:https://stackoverflow.com/questions/899279/why-does-binaryreader-readuint32-reverse-the-bit-pattern


以上所述就是小编给大家介绍的《.net – 为什么BinaryReader.ReadUInt32()反转位模式?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Design Patterns

Head First Design Patterns

Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99

You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具