ホームページ >バックエンド開発 >C++ >C# でバイト配列から C/C 構造体を効率的に解析するにはどうすればよいですか?

C# でバイト配列から C/C 構造体を効率的に解析するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-19 06:04:14442ブラウズ

How to Efficiently Parse C/C   Structures from Byte Arrays in C#?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。