[英]How do I marshal an array of bytes to a struct?
在相關的問題中,我試圖找出最快的方法。 我在該問題中選擇的方法已成為我的瓶頸。 我正在從文件中讀取一些二進制數據,需要將其放入托管結構定義中。 沒有涉及非托管代碼,因此我認為有比分配GCHandle更好的方法。
有沒有辦法將字節數組轉換為相同大小的結構?
我有這樣的方法:
static public T ReadStructure<T>(byte[] bytes)
where T : struct
{
int len = Marshal.SizeOf(typeof(T));
IntPtr i = Marshal.AllocHGlobal(len);
try
{
Marshal.Copy(bytes, 0, i, len);
return (T)Marshal.PtrToStructure(i, typeof(T));
}
finally
{
Marshal.FreeHGlobal(i);
}
}
誠然,這不是很快-但就我而言,並不需要如此。 這是您當前的解決方案,並且發現分配/復制/釋放開銷太慢了嗎?
您可以查看以下代碼:
struct Foo
{
public int x;
}
public unsafe static void Main()
{
byte[] x = new byte[] { 1, 1, 0, 0 };
Foo f;
fixed (byte* xPtr = x)
{
f = *((Fpp*)xPtr);
}
Console.WriteLine(f.x);
}
這絕對是不安全的,如果結構包含一些更復雜的類型,您可能會遇到問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.