在 C# 中进行套接字通信时,需要将结构体转换为字节数组。这可以通过 Marshaling 机制实现。
考虑以下结构体:
public struct CIFSPacket { // 字段定义... public string Buffer; }
Marshal 类提供在托管代码和非托管代码之间进行数据封送处理的方法。将结构体转换为字节数组:
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; }
在封送处理结构体中的字符串时,务必使用 [MarshalAs]
属性指定字符串的表示形式。对于像示例结构体中的 Buffer
这样的固定长度字符串,请使用:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string Buffer;
其中 100 替换为最大字符串长度。
通过使用 Marshaling,可以方便地将结构体转换为字节数组以进行数据传输。此技术通常用于网络应用程序,例如通过套接字发送和接收消息。
以上是如何将 C# 结构转换为字节数组以进行套接字通信?的详细内容。更多信息请关注PHP中文网其他相关文章!