Kann mir jemand sagen, wie man ein Array von Bytes in einer Struktur direkt in C# .NET Version 2 bekommt? Wie der bekannte fread
, der in C gefunden wurde, hatte ich bisher nicht viel Erfolg beim Lesen eines Bytestroms und beim automatischen Füllen einer Struktur. Ich habe einige Implementierungen gesehen, bei denen es im verwalteten Code einen Zeiger-Hokuspokus gibt, indem das Schlüsselwort unsafe
verwendet wird.Ein C# -Äquivalent von C's Freed-Datei i/o
bei dieser Probe Werfen Sie einen Blick:
public unsafe struct foobarStruct{
/* fields here... */
public foobarStruct(int nFakeArgs){
/* Initialize the fields... */
}
public foobarStruct(byte[] data) : this(0) {
unsafe {
GCHandle hByteData = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr pByteData = hByteData.AddrOfPinnedObject();
this = (foobarStruct)Marshal.PtrToStructure(pByteData, this.GetType());
hByteData.Free();
}
}
}
Der Grund Ich habe zwei Konstrukteure in foobarStruct
- Gibt es keine leeren Konstruktor sein kann.
- Übergeben Sie einen Speicherblock (als Byte-Array) in den Konstruktor, wenn Sie die Struktur instanziieren.
Ist diese Implementierung gut genug oder gibt es einen viel saubereren Weg, dies zu erreichen?
Bearbeiten: Ich möchte nicht die ISerializable-Schnittstelle oder ihre Implementierung verwenden. Ich versuche ein binäres Bild zu lesen, um die verwendeten Felder auszuarbeiten und seine Daten anhand der PE-Strukturen zu bestimmen.
auch in C, es ist eine sehr schlechte Idee direkt zu 'fread' in eine' struct' aufgrund Polsterung und Ausrichtung Überlegungen –
Sie Serialisierung betrachtet haben mit hier statt? –
Dieser Vorgang muss in einem unsicheren Block ausgeführt werden, da er nicht sicher ist. Eine Struktur könnte Elemente enthalten, die auf Verweistypen usw. zeigen. Sie möchten unbekannte Byte-Bytes aufnehmen und sie in eine Struktur einfügen, die möglicherweise Zeiger auf irgendetwas enthält. Es ist zu viel, um das Framework zu fragen, was Sie versuchen zu tun, daher der unsichere Block. Sie können es immer noch tun, aber das Framework muss einen "Sie sind auf sich selbst" -Ansatz nehmen.Serialisierung behandelt die zugrunde liegenden Probleme für Sie, aber es passt nicht alle Szenarien. Ich denke nicht, dass du viel besser als der gezeigte Code machen wirst. –