我读了一些在哪里。有人可以通过一个例子来阐明它吗?
'该消息甚至可以是刚刚转换为在调试UART上输出的字节数组的结构。
然后在PC端,传入的字节数组可以很容易地转换回类似于对象的结构。'
答案 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;
}