Why does BinaryReader.ReadUInt32() reverse the bit pattern?
.net, 32-bit, 64-bit, bit-manipulation, endianness
Solution
This seems to be an endianness issue. The docs say ReadUint32 reads in little-endian so the first byte is the least-significant so it goes to the lowest memory location. Your writer must be big-endian?
`BinaryWriter.Write(UInt32)` says it writes little-endian too. Is your binary data source not BinaryWriter?
Essentially what you need to do to fix it is this:
uint a = 0x12345678;
uint b = ((a & 0x000000FF) << 24) + ((a & 0x0000FF00) << 8) + ((a & 0x00FF0000) >> 8) + ((a & 0xFF000000) >> 24);
This shifts the least-significant byte up 24 bits, the 2nd LSB up 8 bits, the 3rd LSB down 8 bits, and the 4th LSB (the MSB) down 24 bits. Doing this is covered in several libraries.
Perhaps using `BitConverter` would be a bit more clear:
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);
Problem
I am trying to read a binary file with the BinaryReader class, and I need to read it in as blocks of UInt32, and then do some bit shifting etc. afterwords. But, for some reason bit order is reversed when I use the ReadUInt32 method. If I for example have a file where the first four bytes looks like this in hex, `0x12345678`, they end up like this after being read by ReadUInt32: `0x78563412`. If I use the ReadBytes(4) method, I get the expected array: ``` [0x00000000] 0x12 byte [0x00000001] 0x34 byte [0x00000002] 0x56 byte [0x00000003] 0x78 byte ``` Why is this? Is it just the way .net represents uints in memory? Is it the same across the different platforms (I am running 64bit Windows 7, .net 3.5 sp1)?