Dot-Net
為什麼 BinaryReader.ReadUInt32() 反轉位模式?
我正在嘗試使用 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)?
這似乎是一個字節順序問題。 文件說 ReadUint32 以 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 的方式有關。儘管大多數台式電腦應該相同,但它在不同平台上可能會有所不同。
這稱為字節序 - 請參閱此處的維基百科: