C#でソケット通信を行う場合、構造体をバイト配列に変換する必要があります。これはマーシャリング メカニズムによって実現されます。
次の構造を考えてみましょう:
<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 は文字列の最大長に置き換えられます。
マーシャリングを使用すると、構造体をデータ送信用のバイト配列に簡単に変換できます。この手法は、ソケットを介したメッセージの送受信などのネットワーク アプリケーションで一般的に使用されます。
以上がソケット通信のためにC#構造をバイト配列に変換する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。