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

Bagaimana untuk Menghuraikan Struktur Data C/C dengan Cekap daripada Tatasusunan Byte dalam C#?

Patricia Arquette
Lepaskan: 2025-01-19 06:10:10
asal
908 orang telah melayarinya

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

Mengendalikan Struktur Data C/C dengan Cekap dalam Tatasusunan Bait C#

Saling kendali antara C# dan C/C selalunya memerlukan penukaran struktur data. Artikel ini menangani senario biasa menerima data sebagai tatasusunan bait dan menukarnya menjadi struct C# yang boleh digunakan.

Strategi Penghuraian untuk Struktur Data Tatasusunan Bait

Kunci untuk berjaya menghuraikan struktur C/C daripada tatasusunan bait dalam C# terletak pada langkah-langkah ini:

  1. Padanan Definisi Struktur C#: Cipta struktur C# yang mencerminkan reka letak struktur C/C. Tentukan jenis data, saiz dan ofset medan dengan tepat menggunakan atribut seperti [StructLayout] dan [FieldOffset].

  2. Semat Memori: Guna GCHandle untuk menyemat tatasusunan bait, menghalang kutipan sampah daripada memindahkannya semasa proses penghuraian.

  3. Penghantaran Memori Terus: Gunakan Marshal.PtrToStructure untuk menghantar terus alamat memori yang disematkan ke struct C# yang anda tentukan. Ini menawarkan prestasi unggul berbanding kaedah alternatif.

  4. Keluaran Memori: Yang penting, lepaskan memori yang disematkan menggunakan handle.Free() untuk mengelakkan kebocoran memori sebaik sahaja data diproses.

Contoh Ilustrasi: Penukaran Struktur C kepada C#

Mari kita pertimbangkan struct C (OldStuff) dan struct C# yang setara (NewStuff):

Struktur C:

typedef struct OldStuff {
    CHAR Name[8];
    UInt32 User;
    CHAR Location[8];
    UInt32 TimeStamp;
    UInt32 Sequence;
    CHAR Tracking[16];
    CHAR Filler[12];
} OldStuff;
Salin selepas log masuk

Struktur C#:

[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
    [FieldOffset(0)]
    public string Name;

    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(8)]
    public uint User;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
    [FieldOffset(12)]
    public string Location;

    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(20)]
    public uint TimeStamp;

    [MarshalAs(UnmanagedType.U4)]
    [FieldOffset(24)]
    public uint Sequence;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    [FieldOffset(28)]
    public string Tracking;

    // Filler is omitted in C# as it's not needed for data access.
}
Salin selepas log masuk

Kaedah C# berikut menunjukkan penghuraian tatasusunan bait:

public NewStuff ByteArrayToNewStuff(byte[] bytes)
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        return (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
    }
    finally
    {
        handle.Free();
    }
}
Salin selepas log masuk

Pengoptimuman Prestasi

Walaupun BinaryReader menyediakan alternatif, Marshal.PtrToStructure secara amnya menawarkan prestasi unggul dengan menghantar terus alamat memori, mengelakkan tafsiran format overhed. Pendekatan langsung ini amat berfaedah untuk set data yang besar.

Dengan menggunakan teknik ini, pembangun boleh mencapai penghuraian yang cekap dan berprestasi bagi struktur data C/C yang dibenamkan dalam tatasusunan bait C#.

Atas ialah kandungan terperinci Bagaimana untuk Menghuraikan Struktur Data C/C dengan Cekap daripada Tatasusunan Byte dalam 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