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

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

DDD
DDDオリジナル
2025-01-19 07:24:11789ブラウズ

How to Efficiently Convert C/C   Data Structures from Byte Arrays to C# Structures?

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

C# では、C/C 構造体からバイト配列データを受信する場合、配列を互換性のある C# 構造体に変換する必要があります。次のメソッドは効率的な変換パスを提供します。

Marshal.PtrToStructure を使用します

この方法では、バイト配列を固定し、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 の比較

BinaryReader は Marshal.PtrToStructure と同様に機能し、バイト配列からデータを読み取ることができます。ただし、追加のオーバーヘッドが発生するため、パフォーマンスが重要なアプリケーションには通常推奨されません。 Marshal.PtrToStructure は、中間変換を行わずに生のバイトで直接動作するため、パフォーマンスが高速になります。

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

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