Кажется, это проблема endianness . В документах говорится, что ReadUint32 читает с прямым порядком байтов, поэтому первый байт является наименее значимым, поэтому он идет в самое низкое место в памяти. Ваш писатель, должно быть, с прямым порядком байтов?
BinaryWriter.Write(UInt32)
говорит, что пишет также little-endian. Ваш двоичный источник данных не BinaryWriter?
По сути, вам нужно сделать следующее:
uint a = 0x12345678;
uint b = ((a & 0x000000FF) << 24) + ((a & 0x0000FF00) << 8) + ((a & 0x00FF0000) >> 8) + ((a & 0xFF000000) >> 24);
Это сдвигает младший значащий байт на 24 бита, 2-й младший бит на 8 бит, 3-й младший младший 8 бит и 4-й младший бит (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);