Что касается меня, то проблема заключалась в импорте ChildModule после AppRoutingModule в AppModule. Изменение порядка их исправило мою проблему.
Похоже, это проблема порядка байтов . В документах говорится, что 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);
Посмотрите в библиотеке Джона Скита MiscUtil классы Endian *, такие как EndianBinaryReader и EndianBitConverter.
Да, это связано с тем, как оборудование вашего компьютера хранит юинты в памяти. Он может быть разным для разных платформ, хотя большинство настольных компьютеров должны быть одинаковыми.
Это называется порядком следования байтов - см. Википедию здесь:
Джон Скит написал BitConverter с настраиваемым порядком байтов. Вы можете найти это полезным.
Это проблема платформы Endianess . Когда вы читаете данные из потока, вы должны читать их в соответствии с порядком байтов, в котором они были записаны. Если вы создали данные в .Net, то .Net их правильно прочитает.
Прочтите 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
и т. Д.