首页 > 后端开发 > C++ > 如何在 C# 中高效地从字节数组中解析 C/C 结构?

如何在 C# 中高效地从字节数组中解析 C/C 结构?

Patricia Arquette
发布: 2025-01-19 06:04:14
原创
442 人浏览过

How to Efficiently Parse C/C   Structures from Byte Arrays in C#?

在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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板