首页 > 后端开发 > C++ > 如何使用封送处理在 C# 结构与字节数组之间进行转换?

如何使用封送处理在 C# 结构与字节数组之间进行转换?

Patricia Arquette
发布: 2025-01-24 14:36:14
原创
728 人浏览过

How to Convert C# Structures to and from Byte Arrays using Marshaling?

在C#中将结构体转换为字节数组

在网络传输数据或将其存储在二进制文件中时,通常需要将结构体转换为字节数组。结构体是值类型,包含多个相关的数 据元素,而字节数组是连续的二进制数据块。

结构体定义

考虑以下表示CIFS(通用互联网文件系统)数据包的C#结构体:

<code class="language-csharp">public struct CIFSPacket
{
    // ... various fields ...
    public string Buffer;
}</code>
登录后复制

转换函数

要将结构体转换为字节数组,可以使用Marshal类的StructToPtr方法。此方法接受两个参数:

  • Structure: 要转换的结构体。
  • Pointer: 将存储转换后数据的字节数组的起始指针。

以下是一个将CIFSPacket结构体转换为字节数组的函数:

<code class="language-csharp">public static byte[] getBytes(CIFSPacket str)
{
    int size = Marshal.SizeOf(str);
    byte[] arr = new byte[size];

    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(str, ptr, true);
        Marshal.Copy(ptr, arr, 0, size);
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return arr;
}</code>
登录后复制

字符串编组

要正确编组字符串,我们需要使用MarshalAs属性。例如,如果我们的Buffer字段是字符串,我们可以将其注释如下:

<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;</code>
登录后复制

此属性指示应将字符串编组为固定长度的、以null结尾的字符串,最大大小为100个字符。

恢复结构体

一旦我们有了结构体的字节数组表示,就可以使用Marshal类的PtrToStructure方法恢复结构体。此方法接受两个参数:

  • Pointer: 包含结构体数据的字节数组的起始指针。
  • Type: 要创建的结构体的类型。

以下是一个将字节数组转换回CIFSPacket结构体的函数:

<code class="language-csharp">public static CIFSPacket fromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();

    int size = Marshal.SizeOf(str);
    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);

        Marshal.Copy(arr, 0, ptr, size);

        str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return str;
}</code>
登录后复制

使用方法

要使用这些函数,只需将CIFSPacket结构体传递给getBytes函数即可获得其字节数组表示。或者,您可以将字节数组传递给fromBytes函数以重新创建原始结构体。

通过利用编组技术,我们可以轻松地将结构体转换为字节数组,并反向转换,从而实现高效的数据传输和存储。

以上是如何使用封送处理在 C# 结构与字节数组之间进行转换?的详细内容。更多信息请关注PHP中文网其他相关文章!

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