C#中结构体定义并转换字节数组详解

2019-12-30 18:54:00刘景俊


 

        上面的代码需要注意的是string类型实际为Char[6]长度的数组,实际使用中只能有效的使用前5个字符,因为char[6]最后一位默认;

        三、结构体与字节数组的互转


    PackTerminalSearch5001 info;
    info.stationCode = "12345";
    info.order = new byte[6] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
    Byte[] recv = StructToBytes(info);

    object obj = BytesToStuct(recv, typeof(PackTerminalSearch5001));
    PackTerminalSearch5001 info5001 = (PackTerminalSearch5001)obj;
    byte[] order = info5001.order;


    //// <summary>
    /// 结构体转byte数组
    /// </summary>
    /// <param name="structObj">要转换的结构体</param>
    /// <returns>转换后的byte数组</returns>
    public static byte[] StructToBytes(object structObj)
    {
      //得到结构体的大小
      int size = Marshal.SizeOf(structObj);
      //创建byte数组
      byte[] bytes = new byte[size];
      //分配结构体大小的内存空间
      IntPtr structPtr = Marshal.AllocHGlobal(size);
      //将结构体拷到分配好的内存空间
      Marshal.StructureToPtr(structObj, structPtr, false);
      //从内存空间拷到byte数组
      Marshal.Copy(structPtr, bytes, 0, size);
      //释放内存空间
      Marshal.FreeHGlobal(structPtr);
      //返回byte数组
      return bytes;
    }

    /// <summary>
    /// byte数组转结构体
    /// </summary>
    /// <param name="bytes">byte数组</param>
    /// <param name="type">结构体类型</param>
    /// <returns>转换后的结构体</returns>
    public static object BytesToStuct(byte[] bytes, Type type)
    {
      //得到结构体的大小
      int size = Marshal.SizeOf(type);
      //byte数组长度小于结构体的大小
      if (size > bytes.Length)
      {
        //返回空
        return null;
      }
      //分配结构体大小的内存空间
      IntPtr structPtr = Marshal.AllocHGlobal(size);
      //将byte数组拷到分配好的内存空间
      Marshal.Copy(bytes, 0, structPtr, size);
      //将内存空间转换为目标结构体
      object obj = Marshal.PtrToStructure(structPtr, type);
      //释放内存空间
      Marshal.FreeHGlobal(structPtr);
      //返回结构体
      return obj;
    }

尽管在C#中结构与类有着惊人的相似度,但在实际应用中,会常常因为一些特殊之类而错误的使用它,下面几点内容是笔者认为应该注意的:

对于结构

1)可以有方法与属性
2)是密封的,不能被继承,或继承其他结构
3)结构隐式地继承自System.ValueType
4)结构有默认的无参数构造函数,可以将每个字段初始化为默认值,但这个默认的构造函数不能被替换,即使重载了带参数的构造函数