首页 > 后端开发 > C++ > 如何高效地将 C/C 数据结构从字节数组转换为 C# 结构?

如何高效地将 C/C 数据结构从字节数组转换为 C# 结构?

DDD
发布: 2025-01-19 07:24:11
原创
827 人浏览过

How to Efficiently Convert C/C   Data Structures from Byte Arrays to C# Structures?

从字节数组中读取C/C 数据结构到C#

在C#中,从C/C 结构体接收字节数组数据时,需要将数组转换为兼容的C#结构体。以下方法提供了高效的转换途径。

使用Marshal.PtrToStructure

此方法涉及固定字节数组并使用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的比较

BinaryReader的功能与Marshal.PtrToStructure类似,允许从字节数组读取数据。但是,它会产生一些额外的开销,通常不推荐用于对性能要求高的应用程序。Marshal.PtrToStructure直接操作原始字节,无需中间转换,因此性能更快。

以上是如何高效地将 C/C 数据结构从字节数组转换为 C# 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

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