在做串口通信时,遇到了一个很有趣的写法
这里的串口信息不是字符串,而是一个由字节数组表示的类
注意这不是json字符串,而是字节数组
思想是在内存里开辟一块内存,将字节数组塞进内存里,然后将这块内存封装为对应类的对象
代码如下
需要引用
using System.Runtime.InteropServices;
代码中RtuAck是自定义的数据类
/// <summary>
/// 字节转RtuAck结构体
/// </summary>
/// <param name="arr"></param>
public RtuAck Bytes2Ack(byte[] arr)
{
RtuAck ack = new RtuAck();
int size = Marshal.SizeOf(ack);
IntPtr ptr = Marshal.AllocHGlobal(size); //声明一块非托管内存,用于存放arr
Marshal.Copy(arr, 0, ptr, size);//将arr存入声明的内存里
ack = (RtuAck)Marshal.PtrToStructure(ptr, ack.GetType());// 将这一块内存转为ack类型
Marshal.FreeHGlobal(ptr);//释放刚才声明的非托管内存
return ack;
}
反之,从类对象转到字节数组的代码如下
public byte[] Ack2Bytes(RtuAck ack)
{
int size = Marshal.SizeOf(ack);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(ack, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr;
}