首頁 > 後端開發 > C++ > 如何在 C# 中有效率地從位元組數組中解析 C/C 結構?

如何在 C# 中有效率地從位元組數組中解析 C/C 結構?

Patricia Arquette
發布: 2025-01-19 06:04:14
原創
442 人瀏覽過

How to Efficiently Parse C/C   Structures from Byte Arrays in C#?

在C#中解析來自位元組數組的C/C 結構體

在C#中處理來自C或C 的資料結構時,高效解析和解釋其內容至關重要。一個常見任務是將儲存為位元組數組的C/C 結構體轉換為對應的C#結構體。

資料複製的最佳實務

最直接的方法是使用GCHandle固定位元組數組在記憶體中的位置,使用Marshal.PtrToStructure將固定的指標轉換為結構體,最後釋放固定的句柄。此方法效率相對較高,並確保資料從位元組數組複製到C#結構體中。

<code class="language-csharp">GCHandle handle = GCHandle.Alloc(byte_array, GCHandleType.Pinned);
NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
handle.Free();</code>
登入後複製

泛型與不安全選項

為了使此方法適用於不同大小的結構體,可以編寫一個泛型函數,如下所示:

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

或者,為了更簡潔的語法,可以使用不安全版本:

<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>
登入後複製

這些方法提供了一種方便且高效的方式來在C#中從位元組數組解析C/C 結構體。

BinaryReader效能注意事項

雖然可以使用BinaryReader類別來完成此任務,但它不太可能比Marshal.PtrToStructure方法產生顯著的效能提升。兩種方法都涉及將位元組數組固定在記憶體中並直接存取底層數據,導致類似的開銷。

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

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