C# で構造体をバイト配列に変換する
C# では、構造体をバイト配列に変換することは、ネットワーク データ送信またはバイナリ データ ストレージの一般的な手法です。このガイドでは、マーシャリングを使用してこれを行う方法を説明します。
あなたが提供したコードは、ネットワーク パケットを表すさまざまなフィールドを含む CIFSPacket と呼ばれる構造を定義します。この構造体をバイト配列に変換するには、次の手順に従います:
<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; } // 将字节数组转换为结构体的函数 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>
CIFSPacket のバッファ文字列フィールドについては、マーシャリングで正しく機能するために、マーシャリング プロパティを指定する必要がある場合があることに注意してください。以下に例を示します:
<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string Buffer;</code>
バッファ文字列の予想される最大サイズに基づいて SizeConst 値を設定することを忘れないでください。
これらの関数を使用すると、GetBytes() を使用して CIFSPacket 構造体をバイト配列に変換したり、FromBytes() を使用してバイト配列から戻すことが簡単にできます。これにより、構造をバイナリ形式で操作および転送するための便利な方法が提供されます。
以上がMarshalingを使用してC#構造をバイト配列に変換する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。