Heim >Backend-Entwicklung >C++ >Wie konvertieren Sie C# Strukturen mit Marschagen in und von Byte -Arrays?

Wie konvertieren Sie C# Strukturen mit Marschagen in und von Byte -Arrays?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-24 14:36:14678Durchsuche

How to Convert C# Structures to and from Byte Arrays using Marshaling?

Struktur in Byte-Array in C# konvertieren

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.

Strukturdefinition

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>

Konvertierungsfunktion

Um eine Struktur in ein Byte-Array umzuwandeln, können Sie die StructToPtr-Methode der Marshal-Klasse verwenden. Diese Methode akzeptiert zwei Parameter:

  • Struktur: Die zu konvertierende Struktur.
  • Zeiger: Der Startzeiger des Byte-Arrays, in dem die konvertierten Daten gespeichert werden.

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>

String-Marshalling

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.

Struktur wiederherstellen

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:

  • Zeiger: Der Startzeiger des Byte-Arrays, das die Strukturdaten enthält.
  • Typ: Der Typ der zu erstellenden Struktur.

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>

Anwendung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn