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
Lepaskan: 2025-01-19 07:36:10
asal
654 orang telah melayarinya

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:

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;
}
Salin selepas log masuk

Versi generik:

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;
}
Salin selepas log masuk

Versi yang lebih ringkas (memerlukan blok kod yang tidak selamat):

unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    fixed (byte* ptr = &bytes[0])
    {
        return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
    }
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan