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

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

Patricia Arquette
リリース: 2025-01-19 06:04:14
オリジナル
495 人が閲覧しました

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# 構造に確実にコピーされます。

GCHandle handle = GCHandle.Alloc(byte_array, GCHandleType.Pinned);
NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
handle.Free();
ログイン後にコピー

ジェネリックおよび安全でないオプション

このメソッドをさまざまなサイズの構造に対して機能させるには、次のような汎用関数を作成できます:

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();
    }
}
ログイン後にコピー

または、よりクリーンな構文のために、安全でないバージョンを使用することもできます:

unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    fixed (byte* ptr = &bytes[0])
    {
        return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
    }
}
ログイン後にコピー

これらのメソッドは、C# のバイト配列から C/C 構造体を解析するための便利で効率的な方法を提供します。

BinaryReader パフォーマンス ノート

BinaryReader クラスを使用してこのタスクを実行することは可能ですが、Marshal.PtrToStructure メソッドに比べてパフォーマンスが大幅に向上する可能性は低いです。どちらの方法でも、バイト配列をメモリに固定し、基礎となるデータに直接アクセスする必要があるため、同様のオーバーヘッドが発生します。

以上がC# でバイト配列から C/C 構造体を効率的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート