Rumah >pembangunan bahagian belakang >C++ >Bagaimana dengan Cekap Menukar Struktur Data C/C daripada Tatasusunan Byte kepada Struktur 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.
Kaedah ini melibatkan menetapkan tatasusunan bait dan menggunakan Marshal.PtrToStructure untuk menukar bait terus kepada struktur C#.
<code class="language-csharp">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(); } }</code>
Versi generik ini membenarkan penukaran sebarang jenis struct daripada tatasusunan bait:
<code class="language-csharp">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(); } }</code>
Untuk aplikasi mudah, gunakan tatasusunan tetap 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>
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!