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

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

Mary-Kate Olsen
リリース: 2025-01-19 07:36:10
オリジナル
599 人が閲覧しました

How to Efficiently Convert a C/C   Data Structure from a Byte Array to a C# Struct?

バイト配列から C/C データ構造を C# に読み取ります

この記事では、C/C 構造体から派生したバイト配列データを C# 構造体に埋める方法について説明します。

GCHandle と Marshal の使用

この方法は 3 つのステップに分かれています:

  1. GCHandle.Alloc を使用して、メモリ内のバイト配列の位置を固定します。
  2. Marshal.PtrToStructure を使用して、固定メモリ アドレスを NewStuff インスタンスに変換します。
  3. 変換が完了したら、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 サイトの他の関連記事を参照してください。

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