C# のバイト配列からの C/C 構造体の解析
C または C# の C のデータ構造を扱う場合、その内容を効率的に解析して解釈することが重要です。一般的なタスクは、バイト配列として保存された C/C 構造体を、対応する C# 構造体に変換することです。
データ レプリケーションのベスト プラクティス
最も直接的な方法は、GCHandle
を使用してメモリ内のバイト配列の位置を固定し、Marshal.PtrToStructure
を使用して固定ポインターを構造体に変換し、最後に固定ハンドルを解放することです。この方法は比較的効率的であり、データがバイト配列から C# 構造に確実にコピーされます。
<code class="language-csharp">GCHandle handle = GCHandle.Alloc(byte_array, GCHandleType.Pinned); NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); handle.Free();</code>
ジェネリックおよび安全でないオプション
このメソッドをさまざまなサイズの構造に対して機能させるには、次のような汎用関数を作成できます:
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); return stuff; } finally { handle.Free(); } }</code>
または、よりクリーンな構文のために、安全でないバージョンを使用することもできます:
<code class="language-csharp">unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct { fixed (byte* ptr = &bytes[0]) { return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T)); } }</code>
これらのメソッドは、C# のバイト配列から C/C 構造体を解析するための便利で効率的な方法を提供します。
BinaryReader パフォーマンス ノート
BinaryReader
クラスを使用してこのタスクを実行することは可能ですが、Marshal.PtrToStructure
メソッドに比べてパフォーマンスが大幅に向上する可能性は低いです。どちらの方法でも、バイト配列をメモリに固定し、基礎となるデータに直接アクセスする必要があるため、同様のオーバーヘッドが発生します。
以上がC# でバイト配列から C/C 構造体を効率的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。