[英]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.