Heim >Backend-Entwicklung >C++ >Wie konvertieren Sie C# Strukturen mit Marschagen in und von Byte -Arrays?
Bei der Übertragung von Daten über das Netzwerk oder der Speicherung in einer Binärdatei ist es häufig erforderlich, die Struktur in ein Byte-Array umzuwandeln. Eine Struktur ist ein Werttyp, der mehrere zusammengehörige Datenelemente enthält, während ein Byte-Array ein fortlaufender Block binärer Daten ist.
Betrachten Sie die folgende C#-Struktur, die ein CIFS-Paket (Common Internet File System) darstellt:
<code class="language-csharp">public struct CIFSPacket { // ... various fields ... public string Buffer; }</code>
Um eine Struktur in ein Byte-Array umzuwandeln, können Sie die StructToPtr-Methode der Marshal-Klasse verwenden. Diese Methode akzeptiert zwei Parameter:
Die folgende Funktion konvertiert eine CIFSPacket-Struktur in ein Byte-Array:
<code class="language-csharp">public static byte[] getBytes(CIFSPacket str) { int size = Marshal.SizeOf(str); byte[] arr = new byte[size]; IntPtr ptr = IntPtr.Zero; try { ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(str, ptr, true); Marshal.Copy(ptr, arr, 0, size); } finally { Marshal.FreeHGlobal(ptr); } return arr; }</code>
Um Zeichenfolgen korrekt zumarshalieren, müssen wir das MarshalAs-Attribut verwenden. Wenn unser Pufferfeld beispielsweise eine Zeichenfolge ist, können wir es wie folgt mit Anmerkungen versehen:
<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string Buffer;</code>
Dieses Attribut gibt an, dass die Zeichenfolge in eine Zeichenfolge mit fester Länge und Nullterminierung und einer maximalen Größe von 100 Zeichen gemarshallt werden soll.
Sobald wir die Byte-Array-Darstellung der Struktur haben, können wir die Struktur mithilfe der PtrToStructure-Methode der Marshal-Klasse wiederherstellen. Diese Methode akzeptiert zwei Parameter:
Die folgende Funktion konvertiert ein Byte-Array zurück in eine CIFSPacket-Struktur:
<code class="language-csharp">public static CIFSPacket fromBytes(byte[] arr) { CIFSPacket str = new CIFSPacket(); int size = Marshal.SizeOf(str); IntPtr ptr = IntPtr.Zero; try { ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr, 0, ptr, size); str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType()); } finally { Marshal.FreeHGlobal(ptr); } return str; }</code>
Um diese Funktionen zu verwenden, übergeben Sie einfach die CIFSPacket-Struktur an die getBytes-Funktion, um deren Byte-Array-Darstellung zu erhalten. Alternativ können Sie ein Byte-Array an die fromBytes-Funktion übergeben, um die ursprüngliche Struktur wiederherzustellen.
Durch die Nutzung der Marshalling-Technologie können wir Strukturen problemlos in Byte-Arrays und zurück konvertieren, was eine effiziente Datenübertragung und -speicherung ermöglicht.
Das obige ist der detaillierte Inhalt vonWie konvertieren Sie C# Strukturen mit Marschagen in und von Byte -Arrays?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!