ホームページ > バックエンド開発 > C++ > ソケット通信のためにC#構造をバイト配列に変換する方法は?

ソケット通信のためにC#構造をバイト配列に変換する方法は?

Patricia Arquette
リリース: 2025-01-24 14:41:12
オリジナル
999 人が閲覧しました

How to Convert C# Structures to Byte Arrays for Socket Communication?

C# における構造体とバイト配列間の変換

C#でソケット通信を行う場合、構造体をバイト配列に変換する必要があります。これはマーシャリング メカニズムによって実現されます。

構造定義

次の構造を考えてみましょう:

<code class="language-csharp">public struct CIFSPacket
{
    // 字段定义...
    public string Buffer;
}</code>
ログイン後にコピー

マーシャリング (シリアル化)

Marshal クラスは、マネージ コードとアンマネージ コードの間でデータをマーシャリングするためのメソッドを提供します。構造体をバイト配列に変換:

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

アンマーシャリング (逆シリアル化)

バイト配列を構造体に変換します:

<code class="language-csharp">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>
ログイン後にコピー

文字列のマーシャリング

構造内の文字列をマーシャリングするときは、[MarshalAs] 属性を使用して文字列の表現を指定してください。構造例の Buffer のような固定長文字列の場合は、

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

100 は文字列の最大長に置き換えられます。

概要

マーシャリングを使用すると、構造体をデータ送信用のバイト配列に簡単に変換できます。この手法は、ソケットを介したメッセージの送受信などのネットワーク アプリケーションで一般的に使用されます。

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

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