首页 >后端开发 >C++ >如何有效地将C#结构转换为网络通信的字节阵列?

如何有效地将C#结构转换为网络通信的字节阵列?

Barbara Streisand
Barbara Streisand原创
2025-01-24 14:51:10223浏览

How to Efficiently Convert C# Structures to Byte Arrays for Network Communication?

简化 C# 结构到字节数组的转换以进行网络传输

跨网络高效传输结构化数据通常需要将 C# 结构转换为字节数组。 虽然结构对相关数据进行分组,但它们并不直接兼容二进制网络传输。

我们举个例子来说明一下:

<code class="language-csharp">public struct CIFSPacket
{
    public uint protocolIdentifier;
    public byte command;
    // ... other fields
}</code>

要将 CIFSPacket 实例 (packet) 转换为字节数组,请按照以下步骤操作:

  1. 导入封送处理:using System.Runtime.InteropServices; 添加到您的代码中。
  2. 大小确定: 使用 Marshal.SizeOf(packet).
  3. 计算结构的大小(以字节为单位)
  4. 内存分配: 使用 IntPtr ptr = Marshal.AllocHGlobal(size); 分配非托管内存。
  5. 结构封送: 将结构复制到分配的内存:Marshal.StructureToPtr(packet, ptr, true);.
  6. 创建字节数组: 创建字节数组并复制数据:byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);.
  7. 内存释放:释放非托管内存:Marshal.FreeHGlobal(ptr);

此过程将结构转换为网络就绪的字节数组。

相反的过程(字节数组到结构)同样简单:

<code class="language-csharp">public CIFSPacket FromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();
    int size = Marshal.SizeOf(str);
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.Copy(arr, 0, ptr, size);
    str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    Marshal.FreeHGlobal(ptr);
    return str;
}</code>

对于结构中的字符串字段,请使用 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] 属性,将 100 替换为最大字符串长度。

此方法可确保可靠的结构到字节数组的转换,以实现稳健的网络通信。

以上是如何有效地将C#结构转换为网络通信的字节阵列?的详细内容。更多信息请关注PHP中文网其他相关文章!

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