Rumah >pembangunan bahagian belakang >C++ >Bagaimana dengan Cekap Menukar Struktur Data C/C daripada Tatasusunan Byte kepada Struktur C#?

Bagaimana dengan Cekap Menukar Struktur Data C/C daripada Tatasusunan Byte kepada Struktur C#?

DDD
DDDasal
2025-01-19 07:24:11829semak imbas

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

Baca struktur data C/C daripada tatasusunan bait kepada C#

Dalam C#, apabila menerima data tatasusunan bait daripada struktur C/C, anda perlu menukar tatasusunan kepada struktur C# yang serasi. Kaedah berikut menyediakan laluan penukaran yang cekap.

Gunakan Marshal.PtrToStructure

Kaedah ini melibatkan menetapkan tatasusunan bait dan menggunakan Marshal.PtrToStructure untuk menukar bait terus kepada struktur C#.

<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>

Versi universal

Versi generik ini membenarkan penukaran sebarang jenis struct daripada tatasusunan bait:

<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>

Versi ringkas

Untuk aplikasi mudah, gunakan tatasusunan tetap yang tidak selamat:

<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>

Perbandingan BinaryReader dan Marshal.PtrToStructure

BinaryReader berfungsi sama seperti Marshal.PtrToStructure, membenarkan membaca data daripada tatasusunan bait. Walau bagaimanapun, ia memerlukan beberapa overhed tambahan dan biasanya tidak disyorkan untuk aplikasi kritikal prestasi. Marshal.PtrToStructure beroperasi secara langsung pada bait mentah tanpa penukaran perantaraan, jadi prestasi lebih pantas.

Atas ialah kandungan terperinci Bagaimana dengan Cekap Menukar Struktur Data C/C daripada Tatasusunan Byte kepada Struktur C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn