Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menukar Struktur Data C/C dengan Cekap daripada Tatasusunan Byte kepada Struktur C#?
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:
GCHandle.Alloc
untuk menetapkan lokasi tatasusunan bait dalam ingatan. Marshal.PtrToStructure
untuk menukar alamat memori tetap kepada contoh NewStuff
. handle.Free()
untuk melepaskan GCHandle
. Kod ringkas:
<code class="language-csharp">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; }</code>
Versi generik:
<code class="language-csharp">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; }</code>
Versi yang lebih ringkas (memerlukan blok kod 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 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!