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