Marshalling uma coleção de bytes big-endian em uma estrutura para extrair valores
Há uma pergunta perspicaz sobrelendo uma estrutura de dados C / C ++ em C # de uma matriz de bytes, mas não consigo que o código funcione para minha coleção de bytes big-endian (ordem de bytes da rede). (EDIT: Observe que minha estrutura real possui mais de um campo.) Existe uma maneira de organizar os bytes em uma versão big-endian da estrutura e extrair os valores na endianness da estrutura (a do host , que geralmente é little-endian)?
(Observe, reverter a matriz de bytesnão trabalho - os bytes de cada valor devem ser revertidos, o que não fornece a mesma coleção que a reversão de todos os bytes.)
Isso deve resumir o que estou procurando (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
{
???
}
Outros links úteis:
Byte de uma estrutura e para preocupações endian
Um pouco mais sobre bytes e endianness (ordem dos bytes)
Leia arquivos binários com mais eficiência usando C #
Inseguro e leitura de arquivos