首页 >后端开发 >C++ >如何将C#结构(CIFSPACKET)转换为网络传输的字节数组?

如何将C#结构(CIFSPACKET)转换为网络传输的字节数组?

Barbara Streisand
Barbara Streisand原创
2025-01-24 14:47:10980浏览

How to Convert a C# Structure (CIFSPacket) to a Byte Array for Network Transmission?

C# 中结构体到字节数组的转换

网络数据传输需要将结构体转换为字节数组。以下解答说明如何将名为 CIFSPacket 的特定结构体在 C# 中转换为字节数组:

问题:

如何将 CIFSPacket 结构体转换为字节数组,以便通过套接字进行网络传输?

解答:

使用 Marshaling 是进行此转换的有效方法。

实现:

  1. 包含头文件: 在程序开头添加 using System.Runtime.InteropServices;

  2. getBytes 函数: 定义一个函数,用于将 CIFSPacket 结构体转换为字节数组:

    <code class="language-csharp"> 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>
  3. fromBytes 函数: 定义一个函数,用于将字节数组转换回 CIFSPacket 结构体:

    <code class="language-csharp"> 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>

其他注意事项:

  • 对于字符串字段,请指定 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] 来表示最大大小为 100 的字符串。

示例用法:

发送函数:

<code class="language-csharp">byte[] byteArr = getBytes(packet);
MyPing.SendTo(byteArr);</code>

接收函数:

<code class="language-csharp">byte[] receivedArr = null; // 接收数据包
CIFSPacket receivedPacket = fromBytes(receivedArr);</code>

以上是如何将C#结构(CIFSPACKET)转换为网络传输的字节数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

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