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#.
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(); } }
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(); } }
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)); } }
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!