public TSocketMessage(StoreHeap heap) { using (MMO_MemoryStream ms = new MMO_MemoryStream()) { foreach (Node node in heap) { ms.WriteShort((short)node.Index); ms.WriteShort((short)node.X); ms.WriteShort((short)node.Y); ms.WriteShort((short)node.Direction); } MsgBuffer = ms.ToArray(); } }
/// <summary> /// 封包 /// </summary> /// <param name="data">待处理的数据</param> /// <returns></returns> public byte[] PackData(TSocketMessage msg, MessageType msgType) { // 封包后返回的数据 byte[] retBuffer = null; // 待封包的数据 byte[] msgBuffer = msg.MsgBuffer; // 数据类型 byte messageType = (byte)msgType; using (MMO_MemoryStream ms = new MMO_MemoryStream()) { //封装包头 ms.WriteShort(head1); ms.WriteShort(head2); //包协议 if (msgBuffer != null) { // 写入数据类型 ms.WriteByte(messageType); // 写入包体长度信息 ms.WriteInt((int)(msgBuffer.Length + 2)); // 获取经异或加密后的数据 msgBuffer = SecurityUtil.Xor(msgBuffer); // 获取 Crc 冗余校验码 ushort crc = Crc16.CalculateCrc16(msgBuffer); // 写入 Crc 冗余校验码 ms.WriteUShort(crc); // 写入 Xor 加密后的数据 ms.Write(msgBuffer, 0, msgBuffer.Length); } else { ms.WriteInt(0); } // 获取处理后的完整数据包 retBuffer = ms.ToArray(); } return(retBuffer); }