/// <summary> /// 转换字节序 /// </summary> /// <param name="header"></param> /// <returns></returns> public static PBHead ConvertByteOrder(PBHead header) { header.mBodyLen = IPAddress.HostToNetworkOrder(header.mBodyLen); header.mMessageId = IPAddress.HostToNetworkOrder(header.mMessageId); header.mTimeStamp = IPAddress.HostToNetworkOrder(header.mTimeStamp); return(header); }
/// <summary> /// 生成消息包 /// </summary> /// <param name="pbbody"></param> /// <returns></returns> public static PBPacket NewPacket(PBBody pbbody) { PBPacket packet = new PBPacket(); PBHead header = new PBHead(); header.mMessageId = GetPacketId(pbbody.GetType()); header.mBodyLen = GetPBBodyLength(pbbody); header.mTimeStamp = DateTime.Now.Ticks; packet.mHead = header; packet.mBody = pbbody; return(packet); }
/// <summary> /// 将流转包头 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static PBHead Buffer2Head(byte[] bytes) { int size = PBConst.PB_HEAD_SIZE; IntPtr buffer = Marshal.AllocHGlobal(size); try { Marshal.Copy(bytes, 0, buffer, size); PBHead header = (PBHead)Marshal.PtrToStructure(buffer, typeof(PBHead)); // 接收到的byte需要转换字节序 header.mBodyLen = header.mBodyLen; header.mMessageId = header.mMessageId; header.mTimeStamp = header.mTimeStamp; return(header); } finally { Marshal.FreeHGlobal(buffer); } }
/// <summary> /// 将头转为流 /// </summary> /// <param name="header"></param> /// <param name="isByteOrder"></param> /// <returns></returns> public static byte[] Head2Buffer(PBHead header, bool isByteOrder = true) { if (isByteOrder) { header = ConvertByteOrder(header); } int size = PBConst.PB_HEAD_SIZE; IntPtr buffer = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(header, buffer, false); byte[] bytes = new byte[size]; Marshal.Copy(buffer, bytes, 0, size); return(bytes); } finally { Marshal.FreeHGlobal(buffer); } }