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
Lepaskan: 2025-01-19 07:24:11
asal
847 orang telah melayarinya

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

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

Versi universal

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

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

Versi ringkas

Untuk aplikasi mudah, gunakan tatasusunan tetap 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

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 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan