Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghuraikan Struktur C/C dengan Cekap daripada Array Byte dalam 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!