ホームページ > バックエンド開発 > C++ > Marshalingを使用してC#構造をバイト配列に変換する方法は?

Marshalingを使用してC#構造をバイト配列に変換する方法は?

Mary-Kate Olsen
リリース: 2025-01-24 14:57:13
オリジナル
941 人が閲覧しました

How to Convert a C# Structure to a Byte Array Using Marshaling?

C# で構造体をバイト配列に変換する

C# では、構造体をバイト配列に変換することは、ネットワーク データ送信またはバイナリ データ ストレージの一般的な手法です。このガイドでは、マーシャリングを使用してこれを行う方法を説明します。

あなたが提供したコードは、ネットワーク パケットを表すさまざまなフィールドを含む CIFSPacket と呼ばれる構造を定義します。この構造体をバイト配列に変換するには、次の手順に従います:

<code class="language-csharp">using System.Runtime.InteropServices;

// 将结构体转换为字节数组的函数
public static byte[] GetBytes(CIFSPacket str)
{
    int size = Marshal.SizeOf(str);
    byte[] arr = new byte[size];

    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(str, ptr, true);
        Marshal.Copy(ptr, arr, 0, size);
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return arr;
}

// 将字节数组转换为结构体的函数
public static CIFSPacket FromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();

    int size = Marshal.SizeOf(str);
    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);
        Marshal.Copy(arr, 0, ptr, size);
        str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return str;
}</code>
ログイン後にコピー

CIFSPacket のバッファ文字列フィールドについては、マーシャリングで正しく機能するために、マーシャリング プロパティを指定する必要がある場合があることに注意してください。以下に例を示します:

<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;</code>
ログイン後にコピー

バッファ文字列の予想される最大サイズに基づいて SizeConst 値を設定することを忘れないでください。

これらの関数を使用すると、GetBytes() を使用して CIFSPacket 構造体をバイト配列に変換したり、FromBytes() を使用してバイト配列から戻すことが簡単にできます。これにより、構造をバイナリ形式で操作および転送するための便利な方法が提供されます。

以上がMarshalingを使用してC#構造をバイト配列に変換する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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