Выделение коллекции байтов с прямым порядком байтов в структуру для извлечения значений
Есть проницательный вопрос очтение структуры данных C / C ++ в C # из байтового массива, но я не могу заставить код работать для моей коллекции байтов с прямым порядком байтов (сетевой порядок байтов). (РЕДАКТИРОВАТЬ: обратите внимание, что моя реальная структура имеет более чем одно поле.) Есть ли способ упорядочить байты в версию структуры с прямым порядком байтов, а затем извлечь значения в порядке байтов структуры (хоста) , который обычно мало-порядковый)?
(Обратите внимание, что обратный массив байтов будетне работа - байты каждого значения должны быть обращены, что не дает вам ту же коллекцию, что и обращение всех байтов.)
Это должно обобщить то, что я ищу (LE = LittleEndian, BE = BigEndian):
void Main()
{
var leBytes = new byte[] {1, 0, 2, 0};
var beBytes = new byte[] {0, 1, 0, 2};
Foo fooLe = ByteArrayToStructure<Foo>(leBytes);
Foo fooBe = ByteArrayToStructureBigEndian<Foo>(beBytes);
Assert.AreEqual(fooLe, fooBe);
}
[StructLayout(LayoutKind.Explicit, Size=4)]
public struct Foo {
[FieldOffset(0)]
public ushort firstUshort;
[FieldOffset(2)]
public ushort secondUshort;
}
T ByteArrayToStructure<T>(byte[] bytes) where T: struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(T));
handle.Free();
return stuff;
}
T ByteArrayToStructureBigEndian<T>(byte[] bytes) where T: struct
{
???
}
Другие полезные ссылки:
Байт структуры и порядковые номера
Еще немного о байтах и порядке байтов (порядок байтов)
Чтение бинарных файлов более эффективно с помощью C #