從位元組數組讀取C/C 資料結構到C#
本文介紹如何將源自C/C 結構體的位元組陣列資料填入C#結構體。
使用GCHandle和Marshal
此方法分三步驟:
GCHandle.Alloc
固定位元組數組在記憶體中的位置。 Marshal.PtrToStructure
將固定記憶體位址轉換為NewStuff
實例。 handle.Free()
釋放GCHandle
。 簡化程式碼:
<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>
泛型版本:
<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>
更簡化的版本(需要unsafe程式碼區塊):
<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方法
使用BinaryReader
未必比Marshal
方法性能更高。兩種方法都需要資料具有正確的佈局和大小才能成功轉換為NewStuff
結構體。
以上是如何有效率地將 C/C 資料結構從位元組數組轉換為 C# 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!