在相关问题中,我试图找出最快的方法。我在那个问题中选择的方法已成为我的瓶颈。我正在从文件中读取一些二进制数据,需要将其放入托管结构定义中。没有涉及非托管代码,所以我认为有一种比分配GCHandle更好的方法。
有没有办法只将一个字节数组转换为相同大小的结构?
答案 0 :(得分:0)
我有这样的方法:
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);
}
}
不可否认,它并不是很快 - 但就我而言,它并不需要。这是您当前的解决方案,并且您发现alloc / copy / release开销太慢了吗?
答案 1 :(得分:0)
你可以查看这样的代码:
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);
}
肯定非常不安全,如果结构中包含更复杂的类型,则可能会遇到问题。