在C#中解析来自字节数组的C/C 结构体
在C#中处理来自C或C 的数据结构时,高效解析和解释其内容至关重要。一个常见任务是将存储为字节数组的C/C 结构体转换为相应的C#结构体。
数据复制的最佳实践
最直接的方法是使用GCHandle
固定字节数组在内存中的位置,使用Marshal.PtrToStructure
将固定的指针转换为结构体,最后释放固定的句柄。此方法效率相对较高,并确保数据从字节数组复制到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>
泛型和不安全选项
为了使此方法适用于不同大小的结构体,可以编写一个泛型函数,如下所示:
<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>
或者,为了更简洁的语法,可以使用不安全版本:
<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>
这些方法提供了一种方便且高效的方式来在C#中从字节数组解析C/C 结构体。
BinaryReader性能注意事项
虽然可以使用BinaryReader
类来完成此任务,但它不太可能比Marshal.PtrToStructure
方法产生显著的性能提升。两种方法都涉及将字节数组固定在内存中并直接访问底层数据,导致类似的开销。
以上是如何在 C# 中高效地从字节数组中解析 C/C 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!