Heim >Backend-Entwicklung >C++ >Wie konvertiert man C/C-Datenstrukturen effizient von Byte-Arrays in C#-Strukturen?

Wie konvertiert man C/C-Datenstrukturen effizient von Byte-Arrays in C#-Strukturen?

DDD
DDDOriginal
2025-01-19 07:24:11788Durchsuche

How to Efficiently Convert C/C   Data Structures from Byte Arrays to C# Structures?

C/C-Datenstruktur vom Byte-Array nach C# lesen

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.

Verwenden Sie Marshal.PtrToStructure

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>

Universalversion

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>

Vereinfachte Version

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>

Vergleich von BinaryReader und Marshal.PtrToStructure

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!

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