Marshalling einer big-endian-byte-Sammlung in ein struct, um pull-out-Werte

Es ist eine aufschlussreiche Frage über das Lesen eines C/C++ - Datenstruktur in C# aus einem byte-array, aber ich Schaffe es nicht, den code an die Arbeit für meine Sammlung von big-endian (network-byte-order) Byte. (EDIT: Hinweis, dass mein real struct hat mehr als nur ein Feld.) Gibt es eine Möglichkeit, Marschall der bytes in einem big-endian-version der Struktur, und ziehen Sie dann die Werte in die endianness des Rahmens (das dem host, das ist in der Regel little-endian)?

(Beachten Sie, dass die Umkehrung der Byte-array wird nicht Arbeit - jeder Wert-bytes muss umgedreht werden, die nicht geben Sie die gleiche Sammlung wie eine Umkehr aller bytes.)

Diese sollten zusammenfassen, was ich bin auf der Suche nach (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 
{
    ???
}

Andere hilfreiche links:

Byte der Struktur und auf endian betrifft

Ein wenig mehr auf bytes und endianness (byte-Reihenfolge)

Read binary-Dateien effizienter mit C#

Unsichere und Lesen von Dateien

Mono ' s Beitrag zu dem Thema

Mastering C# structs

  • Haben Sie einen Blick auf diese: stackoverflow.com/a/2624377/1254743 Es ist nicht einmal mehr feinkörnigen, das können Sie leicht ändern, wenn nötig. Andyou brauchen nicht für den Aufbau Ihrer Strukturen doppelt (besonders schön, wenn Sie verschachtelte Strukturen).
  • Ich denke, die Bibliothek PODCaster (zer7.com/software/podcaster und auf NuGet -) vielleicht hat genau an diesem problem, aber ich kann ehrlich nicht sagen, wie es verwendet werden soll, auch von den Proben.
InformationsquelleAutor Pat | 2010-03-19
Schreibe einen Kommentar