Heim >Backend-Entwicklung >C++ >Wie konvertiert man eine C/C-Datenstruktur effizient von einem Byte-Array in eine C#-Struktur?
C/C-Datenstruktur vom Byte-Array nach C# lesen
In diesem Artikel wird beschrieben, wie aus C/C-Strukturen abgeleitete Byte-Array-Daten in C#-Strukturen gefüllt werden.
Verwenden von GCHandle und Marshal
Diese Methode ist in drei Schritte unterteilt:
GCHandle.Alloc
, um die Position des Byte-Arrays im Speicher festzulegen. Marshal.PtrToStructure
, um eine feste Speicheradresse in eine NewStuff
-Instanz umzuwandeln. handle.Free()
, um GCHandle
freizugeben. Vereinfachter Code:
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); NewStuff stuff; try { stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); } finally { handle.Free(); } return stuff; }</code>
Generische Version:
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { T stuff; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } finally { handle.Free(); } return stuff; }</code>
Vereinfachte Version (erfordert unsicheren Codeblock):
<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-Methode
Die Verwendung von BinaryReader
ist möglicherweise nicht leistungsfähiger als die Methode Marshal
. Bei beiden Methoden müssen die Daten korrekt angeordnet und dimensioniert sein, damit sie erfolgreich in eine NewStuff
-Struktur konvertiert werden können.
Das obige ist der detaillierte Inhalt vonWie konvertiert man eine C/C-Datenstruktur effizient von einem Byte-Array in eine C#-Struktur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!