在一个和仿真软件进行UDP数据通信的项目中,需要接收仿真软件的数据,同时还要给软件发送数据。该软件将所有的参数数据都转成有序的二进制字节数组进行发送,同时接收数据也要这样接收。所以,我需要在我的客户端将数据处理成同样的格式。
实现方式:
采用Marshal.PtrToStructure和 Marshal.StructureToPtr进行相互转换。
结构体定义:
[Serializable]
public struct SendData
{
public int Id;
public float Id2;
}
[Serializable]
public struct ReceiveData
{
public int Status;
public float Percentage;
}
结构体转有序字节数组:
static byte[] StructToBytes<T>(T data) where T : struct
{
int size = Marshal.SizeOf(data);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(data, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
return arr;
}
有序字节数组转结构体:
// 将字节数组转换为结构体
static T BytesToStruct<T>(byte[] arr) where T : struct
{
T data = new T();
int size = Marshal.SizeOf(data);
IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(arr, 0, ptr, size);
data = Marshal.PtrToStructure<T>(ptr);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
return data;
}
注意事项:
1.结构体内不支持嵌套关系
2.结构体内不要使用高级数据结构参数,只使用基本数值类型参数。否则需要你自己实现转换实现
3.结构体内不要使用字符串参数