C'è una domanda perspicace su reading a C/C++ data structure in C# from a byte array, ma non riesco a far funzionare il codice per la mia raccolta di byte big-endian (byte di rete). (EDIT: Si noti che la mia vera struttura ha più di un solo campo.) C'è un modo per eseguire il marshalling dei byte in una versione big-endian della struttura e quindi estrarre i valori nel endianness del framework (quello dell'host , che di solito è little-endian)?Marshalling di una raccolta di byte big-endian in una struttura per estrarre valori
(Nota, invertendo l'array di byte sarà non lavoro -. Byte di ogni valore deve essere invertita, che non ti dà la stessa collezione di invertire tutti i byte)
Questo dovrebbe riassumere quello che ho 'm alla ricerca di (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
{
???
}
Altri link utili:
Byte of a struct and onto endian concerns
A little more on bytes and endianness (byte order)
Read binary files more efficiently using C#
Mono's contribution to the issue
Dai un'occhiata a questo: http://stackoverflow.com/a/2624377/1254743 Lo fa ancora più a grana fine, che puoi facilmente modificare se necessario. Non hai bisogno di costruire le tue strutture due volte (specialmente se hai strutture annidate). – Onur
Penso che la libreria PODCaster (http://www.zer7.com/software/podcaster e su NuGet) potrebbe essere indirizzata a questo problema, ma onestamente non so dire come dovrebbe essere usato, anche dagli esempi. – Pat