首頁 > 後端開發 > C++ > 如何使用封元將C#結構轉換為字節數組?

如何使用封元將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#中,將結構體轉換為字節數組是網絡數據傳輸或二進制數據存儲的常用技巧。本指南將演示如何使用 Marshaling 完成此操作。

您提供的代碼定義了一個名為 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 中的 Buffer 字符串字段,您可能需要指定 Marshaling 屬性才能使其與 Marshaling 正確配合使用。以下是一個示例:

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

請記住,根據 Buffer 字符串的最大預期大小設置 SizeConst 值。

有了這些函數,您可以使用 GetBytes() 將 CIFSPacket 結構體輕鬆轉換為字節數組,並使用 FromBytes() 從字節數組轉換回來。這提供了一種方便的方法來以二進制格式操作和傳輸您的結構體。

以上是如何使用封元將C#結構轉換為字節數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板