首頁 >後端開發 >C++ >如何有效率地將 C/C 資料結構從位元組數組轉換為 C# 結構?

如何有效率地將 C/C 資料結構從位元組數組轉換為 C# 結構?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-19 07:36:10601瀏覽

How to Efficiently Convert a C/C   Data Structure from a Byte Array to a C# Struct?

從位元組數組讀取C/C 資料結構到C#

本文介紹如何將源自C/C 結構體的位元組陣列資料填入C#結構體。

使用GCHandle和Marshal

此方法分三步驟:

  1. 使用GCHandle.Alloc固定位元組數組在記憶體中的位置。
  2. 使用Marshal.PtrToStructure將固定記憶體位址轉換為NewStuff實例。
  3. 轉換完成後,使用handle.Free()釋放GCHandle

簡化程式碼:

<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes)
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    NewStuff stuff;
    try
    {
        stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}</code>

泛型版本:

<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    T stuff;
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}</code>

更簡化的版本(需要unsafe程式碼區塊):

<code class="language-csharp">unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    fixed (byte* ptr = &bytes[0])
    {
        return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
    }
}</code>

BinaryReader方法

使用BinaryReader未必比Marshal方法性能更高。兩種方法都需要資料具有正確的佈局和大小才能成功轉換為NewStuff結構體。

以上是如何有效率地將 C/C 資料結構從位元組數組轉換為 C# 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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