在 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中文網其他相關文章!