将struct转换为字节数组

时间:2015-08-24 11:56:17

标签: c#

我读了一些在哪里。有人可以通过一个例子来阐明它吗?

'该消息甚至可以是刚刚转换为在调试UART上输出的字节数组的结构。

然后在PC端,传入的字节数组可以很容易地转换回类似于对象的结构。'

1 个答案:

答案 0 :(得分:2)

您可以使用unsafe作为字节指针访问任何blittable(数组,字符串,结构等)类型。

值类型的局部变量不必固定:

public unsafe void ReadAsBytePointer(MyStruct obj)
{
    byte* ptr = (byte*)&obj;
    ...    
}

必须固定数组。最简单的解决方案是使用fixed:

public unsafe void ReadAsBytePointer(MyStruct[] input)
{
    fixed(MyStruct* ptr = input)
    {
        byte* byteArray = (byte*)ptr;
    }
}

对于未在代码中添加unsafe的一般情况,您可以使用GCHandle:

static byte[] GetBytes<T>(T input)
  where T : struct
{
    int size = Marshal.SizeOf(typeof(T));
    byte[] result = new byte[size];
    GCHandle gc = GCHandle.Alloc(input, GCHandleType.Pinned);
    try
    {
        Marshal.Copy(gc.AddrOfPinnedObject(), result, 0, size);
    }
    finally
    {
        gc.Free();
    }
    return result;
}