C# 通讯时字节流和结构体互转

openkk 12年前

//转换C#代码:    //结构体转换成字节流    public static byte[] StructToBytes<T>(T obj)      {  int size = Marshal.SizeOf(typeof(T));     IntPtr bufferPtr = Marshal.AllocHGlobal(size);  try     {         Marshal.StructureToPtr(obj, bufferPtr, false);         byte[] bytes = new byte[size];         Marshal.Copy(bufferPtr, bytes, 0, size);           return bytes;  }          catch(Exception ex)          {              throw new Exception("Error in StructToBytes ! " + ex.Message);          }  finally     {       Marshal.FreeHGlobal(bufferPtr);     }        }      //字节流转换成结构体        public static T BytesToStruct<T>(byte[] bytes, int startIndex = 0)      {          if (bytes == null) return default(T);          if (bytes.Length <= 0) return default(T);  int objLength = Marshal.SizeOf(typeof(T));          IntPtr bufferPtr = Marshal.AllocHGlobal(objLength);          try//struct_bytes转换          {              Marshal.Copy(bytes, startIndex, bufferPtr, objLength);              return (T)Marshal.PtrToStructure(bufferPtr, typeof(T));          }          catch(Exception ex)          {              throw new Exception("Error in BytesToStruct ! " + ex.Message);          }          finally          {              Marshal.FreeHGlobal(bufferPtr);          }      }      [StructLayout(LayoutKind.Sequential, Pack=1)]  //变量在内存中的对齐方式   public struct LolMsgHeader  {  public ushort wMsgLen;  public byte    header_ver;  public ushort  uAction; //动作行为  public uint  dwUid; //用户ID  public uint dwSeq; //包的序列号  public uint  dwPid; //当前服务ID    };      public struct LOLMoveMsg  {  [MarshalAs(UnmanagedType.SysUInt, SizeConst = LOLMsgConst.MASK_LEN)]  public WORD        mask;                   // 掩码  [MarshalAs(UnmanagedType.ByValArray, SizeConst = LOLMsgConst.NAME_LEN)]  public byte[] szName;  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LOLMsgConst.NAME_LEN)]  public string targetName; //目的对象  public short x;  public short y;  public byte byReached; //到达目的地,未到达0,到达1  };      //注意,之前遇到过在ios真机上运行不起来的bug,在android真机和ios模拟器上都是OK的问题,    后来把所有的ByValArray改成ByValTStr解决了这个问题。    如果有可能,建议不要用数组,全部都用基本类型。