C# 中结构体到字节数组的转换
网络数据传输需要将结构体转换为字节数组。以下解答说明如何将名为 CIFSPacket 的特定结构体在 C# 中转换为字节数组:
问题:
如何将 CIFSPacket 结构体转换为字节数组,以便通过套接字进行网络传输?
解答:
使用 Marshaling 是进行此转换的有效方法。
实现:
包含头文件: 在程序开头添加 using System.Runtime.InteropServices;
。
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>
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中文网其他相关文章!