首頁 >後端開發 >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#結構轉換為字節陣列。 儘管結構組相關的數據,但它們與二進製網絡傳輸並不直接兼容。

>

讓我們用一個示例說明:

>將a
<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. 結構編制:
  5. 將結構複製到分配的存儲器: Marshal.StructureToPtr(packet, ptr, true);字節數組創建:
  6. 創建一個字節數組並複制數據:
  7. byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);內存版本:
  8. 釋放未託管的內存:
  9. Marshal.FreeHGlobal(ptr);此過程將結構轉換為可以進行網絡的字節陣列。
  10. 反向過程(字節陣列到結構)同樣簡單:>

對於您的結構中的字符串字段,請使用

屬性,用最大字符串長度替換

此方法可確保可靠的結構到字節陣列轉換可靠的網絡通信。
<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>

以上是如何有效地將C#結構轉換為網絡通信的字節陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn