在C#中,从C/C 结构体接收字节数组数据时,需要将数组转换为兼容的C#结构体。以下方法提供了高效的转换途径。
此方法涉及固定字节数组并使用Marshal.PtrToStructure直接将字节转换为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>
此通用版本允许从字节数组转换任何结构体类型:
<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>
对于简单的应用,可以使用不安全的固定数组:
<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的功能与Marshal.PtrToStructure类似,允许从字节数组读取数据。但是,它会产生一些额外的开销,通常不推荐用于对性能要求高的应用程序。Marshal.PtrToStructure直接操作原始字节,无需中间转换,因此性能更快。
以上是如何高效地将 C/C 数据结构从字节数组转换为 C# 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!