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

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

Patricia Arquette
Patricia Arquetteasal
2025-01-19 06:04:14442semak imbas

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

Menghuraikan struktur C/C daripada tatasusunan bait dalam C#

Apabila berurusan dengan struktur data daripada C atau C dalam C#, adalah penting untuk menghuraikan dan mentafsir kandungannya dengan cekap. Tugas biasa ialah menukar struktur C/C yang disimpan sebagai tatasusunan bait ke dalam struktur C# yang sepadan.

Amalan Terbaik untuk Replikasi Data

Kaedah paling langsung ialah menggunakan GCHandle untuk menetapkan lokasi tatasusunan bait dalam ingatan, gunakan Marshal.PtrToStructure untuk menukar penuding tetap kepada struktur, dan akhirnya lepaskan pemegang tetap. Kaedah ini agak cekap dan memastikan data disalin daripada tatasusunan bait ke dalam struktur C#.

<code class="language-csharp">GCHandle handle = GCHandle.Alloc(byte_array, GCHandleType.Pinned);
NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
handle.Free();</code>

Generik dan pilihan yang tidak selamat

Untuk menjadikan kaedah ini berfungsi untuk struktur saiz yang berbeza, anda boleh menulis fungsi generik seperti ini:

<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
        return stuff;
    }
    finally
    {
        handle.Free();
    }
}</code>

Atau, untuk sintaks yang lebih bersih, anda boleh menggunakan versi 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 ini menyediakan cara yang mudah dan cekap untuk menghuraikan struktur C/C daripada tatasusunan bait dalam C#.

Nota Prestasi BinaryReader

Walaupun boleh menggunakan kelas BinaryReader untuk menyelesaikan tugasan ini, ia tidak mungkin menghasilkan peningkatan prestasi yang ketara berbanding kaedah Marshal.PtrToStructure. Kedua-dua kaedah melibatkan menyemat tatasusunan bait dalam ingatan dan mengakses data asas secara langsung, menghasilkan overhed yang serupa.

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