首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么BinaryReader.ReadUInt32()反转位模式?

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

Stack Overflow用户
提问于 2009-05-22 18:25:08
回答 6查看 4.5K关注 0票数 8

我正在尝试用BinaryReader类读取一个二进制文件,我需要将它作为UInt32块读取,然后做一些位移位等操作。

但是,由于某些原因,当我使用ReadUInt32方法时,位顺序颠倒了。

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

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

代码语言:javascript
运行
复制
[0x00000000]    0x12    byte
[0x00000001]    0x34    byte
[0x00000002]    0x56    byte
[0x00000003]    0x78    byte

为什么会这样呢?这只是.net在内存中表示元素的方式吗?在不同的平台上(我运行的是64位的Windows7,.net 3.5 sp1),它是一样的吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-22 18:31:08

这似乎是一个endianness问题。The docs说,ReadUint32在小端读取,所以第一个字节是最不重要的,所以它会去最低的内存位置。你的作者一定是大端的?

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

基本上,你需要做的是解决这个问题:

代码语言:javascript
运行
复制
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会更清楚一些:

代码语言:javascript
运行
复制
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);
票数 8
EN

Stack Overflow用户

发布于 2009-05-22 18:30:23

是的,这与你的计算机硬件在内存中存储元素的方式有关。它可以在不同的平台上有所不同,尽管大多数台式计算机应该是相同的。

这就是字节序--请看维基百科:

http://en.wikipedia.org/wiki/Endian

票数 9
EN

Stack Overflow用户

发布于 2009-05-22 18:33:39

查看Jon Skeet的Endian*类的MiscUtil库,如EndianBinaryReader和EndianBitConverter。

http://www.yoda.arachsys.com/csharp/miscutil/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/899279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档