C# では、C/C 構造体からバイト配列データを受信する場合、配列を互換性のある C# 構造体に変換する必要があります。次のメソッドは効率的な変換パスを提供します。
この方法では、バイト配列を固定し、Marshal.PtrToStructure を使用してバイトを C# 構造体に直接変換します。
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); return stuff; } finally { handle.Free(); } }</code>
この汎用バージョンでは、バイト配列から任意の構造体型を変換できます:
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } 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>
BinaryReader は Marshal.PtrToStructure と同様に機能し、バイト配列からデータを読み取ることができます。ただし、追加のオーバーヘッドが発生するため、パフォーマンスが重要なアプリケーションには通常推奨されません。 Marshal.PtrToStructure は、中間変換を行わずに生のバイトで直接動作するため、パフォーマンスが高速になります。
以上がC/C データ構造をバイト配列から C# 構造に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。