ネットワーク送信のための C# 構造体からバイト配列への変換の合理化
ネットワーク間で構造化データを効率的に送信するには、多くの場合、C# 構造体をバイト配列に変換する必要があります。 構造体は関連データをグループ化しますが、バイナリ ネットワーク送信と直接互換性はありません。
例で説明してみましょう:
<code class="language-csharp">public struct CIFSPacket { public uint protocolIdentifier; public byte command; // ... other fields }</code>
CIFSPacket
インスタンス (packet
) をバイト配列に変換するには、次の手順に従います。
using System.Runtime.InteropServices;
を追加します。Marshal.SizeOf(packet)
を使用して構造体のサイズをバイト単位で計算します。IntPtr ptr = Marshal.AllocHGlobal(size);
を使用してアンマネージ メモリを割り当てます。Marshal.StructureToPtr(packet, ptr, true);
.byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);
.Marshal.FreeHGlobal(ptr);
.このプロセスは、構造体をネットワーク対応のバイト配列に変換します。
逆のプロセス (バイト配列から構造体へ) も同様に簡単です。
<code class="language-csharp">public CIFSPacket FromBytes(byte[] arr) { CIFSPacket str = new CIFSPacket(); int size = Marshal.SizeOf(str); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr, 0, ptr, size); str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType()); Marshal.FreeHGlobal(ptr); return str; }</code>
構造内の文字列フィールドの場合は、[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
属性を使用し、100
を最大文字列長に置き換えます。
この方法により、信頼性の高い構造体からバイト配列への変換が保証され、堅牢なネットワーク通信が実現します。
以上がネットワーク通信用に C# 構造体をバイト配列に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。