如何编组结构的字节数组?

时间:2009-07-21 15:00:45

标签: c# struct bytearray

Related Question

在相关问题中,我试图找出最快的方法。我在那个问题中选择的方法已成为我的瓶颈。我正在从文件中读取一些二进制数据,需要将其放入托管结构定义中。没有涉及非托管代码,所以我认为有一种比分配GCHandle更好的方法。

有没有办法只将一个字节数组转换为相同大小的结构?

2 个答案:

答案 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);
}

肯定非常不安全,如果结构中包含更复杂的类型,则可能会遇到问题。