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

ネットワーク通信用に C# 構造体をバイト配列に効率的に変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-24 14:51:10223ブラウズ

How to Efficiently Convert C# Structures to Byte Arrays for Network Communication?

ネットワーク送信のための C# 構造体からバイト配列への変換の合理化

ネットワーク間で構造化データを効率的に送信するには、多くの場合、C# 構造体をバイト配列に変換する必要があります。 構造体は関連データをグループ化しますが、バイナリ ネットワーク送信と直接互換性はありません。

例で説明してみましょう:

<code class="language-csharp">public struct CIFSPacket
{
    public uint protocolIdentifier;
    public byte command;
    // ... other fields
}</code>

CIFSPacket インスタンス (packet) をバイト配列に変換するには、次の手順に従います。

  1. マーシャリングのインポート: コードに using System.Runtime.InteropServices; を追加します。
  2. サイズの決定: Marshal.SizeOf(packet) を使用して構造体のサイズをバイト単位で計算します。
  3. メモリ割り当て: IntPtr ptr = Marshal.AllocHGlobal(size); を使用してアンマネージ メモリを割り当てます。
  4. 構造体のマーシャリング: 割り当てられたメモリに構造体をコピーします: Marshal.StructureToPtr(packet, ptr, true);.
  5. バイト配列の作成: バイト配列を作成し、データをコピーします: byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);.
  6. メモリ解放: アンマネージド メモリを解放します: Marshal.FreeHGlobal(ptr);.

このプロセスは、構造体をネットワーク対応のバイト配列に変換します。

逆のプロセス (バイト配列から構造体へ) も同様に簡単です。

<code class="language-csharp">public CIFSPacket FromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();
    int size = Marshal.SizeOf(str);
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.Copy(arr, 0, ptr, size);
    str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    Marshal.FreeHGlobal(ptr);
    return str;
}</code>

構造内の文字列フィールドの場合は、[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] 属性を使用し、100 を最大文字列長に置き換えます。

この方法により、信頼性の高い構造体からバイト配列への変換が保証され、堅牢なネットワーク通信が実現します。

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

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