首页 >后端开发 >C++ >如何使用封送处理将 C# 结构转换为字节数组?

如何使用封送处理将 C# 结构转换为字节数组?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-24 14:57:13993浏览

How to Convert a C# Structure to a Byte Array Using Marshaling?

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

在C#中,将结构体转换为字节数组是网络数据传输或二进制数据存储的常用技巧。本指南将演示如何使用 Marshaling 完成此操作。

您提供的代码定义了一个名为 CIFSPacket 的结构体,其中包含表示网络数据包的各个字段。要将此结构体转换为字节数组,请按照以下步骤操作:

<code class="language-csharp">using System.Runtime.InteropServices;

// 将结构体转换为字节数组的函数
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;
}

// 将字节数组转换为结构体的函数
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 中的 Buffer 字符串字段,您可能需要指定 Marshaling 属性才能使其与 Marshaling 正确配合使用。以下是一个示例:

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

请记住,根据 Buffer 字符串的最大预期大小设置 SizeConst 值。

有了这些函数,您可以使用 GetBytes() 将 CIFSPacket 结构体轻松转换为字节数组,并使用 FromBytes() 从字节数组转换回来。这提供了一种方便的方法来以二进制格式操作和传输您的结构体。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn