首頁 >後端開發 >C++ >如何使用編制將c#結構轉換為字節陣列和從字節陣列轉換?

如何使用編制將c#結構轉換為字節陣列和從字節陣列轉換?

Patricia Arquette
Patricia Arquette原創
2025-01-24 14:36:14678瀏覽

How to Convert C# Structures to and from Byte Arrays using Marshaling?

在C#中將結構體轉換為字節數組

在網絡傳輸數據或將其存儲在二進製文件中時,通常需要將結構體轉換為字節數組。結構體是值類型,包含多個相關的數 據元素,而字節數組是連續的二進制數據塊。

結構體定義

考慮以下表示CIFS(通用互聯網文件系統)數據包的C#結構體:

<code class="language-csharp">public struct CIFSPacket
{
    // ... various fields ...
    public string Buffer;
}</code>

轉換函數

要將結構體轉換為字節數組,可以使用Marshal類的StructToPtr方法。此方法接受兩個參數:

  • Structure: 要轉換的結構體。
  • Pointer: 將存儲轉換後數據的字節數組的起始指針。

以下是一個將CIFSPacket結構體轉換為字節數組的函數:

<code class="language-csharp">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>

字符串編組

要正確編組字符串,我們需要使用MarshalAs屬性。例如,如果我們的Buffer字段是字符串,我們可以將其註釋如下:

<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;</code>

此屬性指示應將字符串編組為固定長度的、以null結尾的字符串,最大大小為100個字符。

恢復結構體

一旦我們有了結構體的字節數組表示,就可以使用Marshal類的PtrToStructure方法恢復結構體。此方法接受兩個參數:

  • Pointer: 包含結構體數據的字節數組的起始指針。
  • Type: 要創建的結構體的類型。

以下是一個將字節數組轉換回CIFSPacket結構體的函數:

<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>

使用方法

要使用這些函數,只需將CIFSPacket結構體傳遞給getBytes函數即可獲得其字節數組表示。或者,您可以將字節數組傳遞給fromBytes函數以重新創建原始結構體。

通過利用編組技術,我們可以輕鬆地將結構體轉換為字節數組,並反向轉換,從而實現高效的數據傳輸和存儲。

以上是如何使用編制將c#結構轉換為字節陣列和從字節陣列轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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