c#中结构体与有序二进制字节数组的相互转换

在一个和仿真软件进行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.结构体内不要使用字符串参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值