バイト配列から C/C データ構造を C# に読み取ります
この記事では、C/C 構造体から派生したバイト配列データを C# 構造体に埋める方法について説明します。
GCHandle と Marshal の使用
この方法は 3 つのステップに分かれています:
GCHandle.Alloc
を使用して、メモリ内のバイト配列の位置を固定します。 Marshal.PtrToStructure
を使用して、固定メモリ アドレスを NewStuff
インスタンスに変換します。 handle.Free()
を使用して GCHandle
を解放します。 簡易コード:
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); NewStuff stuff; try { stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); } finally { handle.Free(); } return stuff; }</code>
汎用バージョン:
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { T stuff; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } finally { handle.Free(); } return stuff; }</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>
BinaryReader メソッド
BinaryReader
を使用すると、Marshal
メソッドよりもパフォーマンスが向上しない可能性があります。どちらの方法でも、NewStuff
構造に正常に変換するには、データが正しくレイアウトされ、サイズ設定されている必要があります。
以上がC/C データ構造をバイト配列から C# 構造体に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。