Почему делает BinaryReader. ReadUInt32 () инвертируют комбинацию двоичных разрядов?

Что касается меня, то проблема заключалась в импорте ChildModule после AppRoutingModule в AppModule. Изменение порядка их исправило мою проблему.

7
задан Robert Harvey 25 July 2012 в 23:25
поделиться

6 ответов

Похоже, это проблема порядка байтов . В документах говорится, что ReadUint32 читает с прямым порядком байтов, поэтому первый байт является наименее значимым, поэтому он переходит в самую нижнюю ячейку памяти. Ваш писатель должен быть с прямым порядком байтов?

BinaryWriter.Write (UInt32) говорит, что он пишет и с прямым порядком байтов. Ваш источник двоичных данных не является BinaryWriter?

По сути, что вам нужно сделать, чтобы исправить это:

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

Это сдвигает младший байт на 24 бита, второй младший бит на 8 бит, третий младший бит на 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);
8
ответ дан 6 December 2019 в 08:17
поделиться

Посмотрите в библиотеке Джона Скита MiscUtil классы Endian *, такие как EndianBinaryReader и EndianBitConverter.

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

3
ответ дан 6 December 2019 в 08:17
поделиться

Да, это связано с тем, как оборудование вашего компьютера хранит юинты в памяти. Он может быть разным для разных платформ, хотя большинство настольных компьютеров должны быть одинаковыми.

Это называется порядком следования байтов - см. Википедию здесь:

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

8
ответ дан 6 December 2019 в 08:17
поделиться

Джон Скит написал BitConverter с настраиваемым порядком байтов. Вы можете найти это полезным.

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

2
ответ дан 6 December 2019 в 08:17
поделиться

Это проблема платформы Endianess . Когда вы читаете данные из потока, вы должны читать их в соответствии с порядком байтов, в котором они были записаны. Если вы создали данные в .Net, то .Net их правильно прочитает.

1
ответ дан 6 December 2019 в 08:17
поделиться

Прочтите Generic BinaryReader и BinaryWriter Extensions , отличный способ справиться с универсальным преобразованием типов неуправляемым способом.

Для VB.NET (только безопасный код, также может быть реализован на C #) используйте следующее:

Импортирует System.IO Импортирует System.Runtime.CompilerServices Импортирует System.Runtime.InteropServices

<HideModuleName()>
Public Module BinaryReaderExtensions

 <Extension()>
 Public Function Read(Of T As Structure)(br As BinaryReader) As T
  Dim bytes = br.ReadBytes(Marshal.SizeOf(GetType(T)))
  Dim handle = GCHandle.Alloc(bytes, GCHandleType.Pinned)
  Return Marshal.PtrToStructure(handle.AddrOfPinnedObject, GetType(T))
 End Function

 <Extension()>
 Public Function ReadReverse(Of T As Structure)(br As BinaryReader) As T
  Dim bytes = br.ReadBytes(Marshal.SizeOf(GetType(T))).Reverse.ToArray
  Dim handle = GCHandle.Alloc(bytes, GCHandleType.Pinned)
  Return Marshal.PtrToStructure(handle.AddrOfPinnedObject, GetType(T))
 End Function

End Module

Теперь вы можете реализовать ту же функциональность для BitConverter , для BinaryWriter и т. Д.

0
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: