Dot-Net

為什麼 BinaryReader.ReadUInt32() 反轉位模式?

  • April 19, 2013

我正在嘗試使用 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)?

這似乎是一個字節順序問題。 文件說 Rea​​dUint32 以 little-endian 方式讀取,因此第一個字節是最不重要的,因此它會到達最低的記憶體位置。你的作者一定是大端的?

BinaryWriter.Write(UInt32) 說它也寫小端。你的二進制數據源不是 BinaryWriter 嗎?

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

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

這會將最低有效字節向上移動 24 位,將第 2 個 LSB 向上移動 8 位,將第 3 個 LSB 向下移動 8 位,將第 4 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);

是的,這與您的電腦硬體在記憶體中儲存 uint 的方式有關。儘管大多數台式電腦應該相同,但它在不同平台上可能會有所不同。

這稱為字節序 - 請參閱此處的維基百科:

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

引用自:https://stackoverflow.com/questions/899279