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

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-19 07:36:10601semak imbas

How to Efficiently Convert a C/C   Data Structure from a Byte Array to a C# Struct?

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

Artikel ini menerangkan cara mengisi data tatasusunan bait yang diperoleh daripada struktur C/C ke dalam struktur C#.

Menggunakan GCHandle dan Marshal

Kaedah ini terbahagi kepada tiga langkah:

  1. Gunakan GCHandle.Alloc untuk menetapkan lokasi tatasusunan bait dalam ingatan.
  2. Gunakan Marshal.PtrToStructure untuk menukar alamat memori tetap kepada contoh NewStuff.
  3. Setelah penukaran selesai, gunakan handle.Free() untuk melepaskan GCHandle.

Kod ringkas:

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

Versi generik:

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

Versi yang lebih ringkas (memerlukan blok kod 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>

Kaedah BinaryReader

Menggunakan BinaryReader mungkin tidak lebih berprestasi daripada kaedah Marshal. Kedua-dua kaedah memerlukan data dibentangkan dengan betul dan bersaiz untuk berjaya ditukar menjadi struktur NewStuff.

Atas ialah kandungan terperinci Bagaimana untuk Menukar Struktur Data C/C dengan Cekap 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