Есть проницательный вопрос о чтении данных 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 #