Wenn Sie in C# Byte-Array-Daten von einer C/C-Struktur empfangen, müssen Sie das Array in eine kompatible C#-Struktur konvertieren. Die folgenden Methoden bieten einen effizienten Konvertierungspfad.
Diese Methode beinhaltet das Korrigieren eines Byte-Arrays und die Verwendung von Marshal.PtrToStructure, um die Bytes direkt in eine C#-Struktur zu konvertieren.
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); return stuff; } finally { handle.Free(); } }</code>
Diese generische Version ermöglicht die Konvertierung jedes Strukturtyps aus einem Byte-Array:
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } finally { handle.Free(); } }</code>
Verwenden Sie für einfache Anwendungen unsichere feste Arrays:
<code class="language-csharp">unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct { fixed (byte* ptr = &bytes[0]) { return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T)); } }</code>
BinaryReader funktioniert ähnlich wie Marshal.PtrToStructure und ermöglicht das Lesen von Daten aus Byte-Arrays. Dies verursacht jedoch einen gewissen Mehraufwand und wird im Allgemeinen nicht für leistungskritische Anwendungen empfohlen. Marshal.PtrToStructure arbeitet direkt mit Rohbytes ohne Zwischenkonvertierung, sodass die Leistung schneller ist.
Das obige ist der detaillierte Inhalt vonWie konvertiert man C/C-Datenstrukturen effizient von Byte-Arrays in C#-Strukturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!