/** 解密和解压缩数据包 **/ public void Parse(CrypTea pCryp) { if (IsCryp()) { pCryp.Decryption(m_pData, (ushort)(GetPacketSize() - SPacketHeader.PACKET_HEADER_SIZE)); } //if (IsZip()) //{ // m_pData.uncompress(); //} }
public ClientSocket() { m_socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_queuePacket = new Queue <byte[]>(); NewPacket(); byte[] aKey = new byte[16]; aKey = System.Text.Encoding.Default.GetBytes("[/28!~&0sM1-)G&z"); m_pCryp = new CrypTea(aKey); }
/** 生成完整的数据包: 加密 压缩 计算包头 **/ public void Build(CrypTea pCryp) { m_pPacketHeader[0] = 0; m_pPacketHeader[1] = 0; m_pPacketHeader[2] = 0; m_pPacketHeader[3] = 0; m_pPacketHeader[4] = 0; m_pPacketHeader[5] = 0; SetDataSize(); /// 进行压缩 if (m_wCurWritePos >= 96) { // 当前有效数据 byte[] pValidData = new byte[GetCurDataSize()]; Array.Copy(m_pData, 0, pValidData, 0, pValidData.Length); // 压缩后的数据 //byte[] pData = Compress.Compression(pValidData); byte[] pData; Compress.CompressData(pValidData, out pData); // 将压缩后的数据拷贝到数据数组中 Array.Copy(pData, 0, m_pData, 0, pData.Length); // 重新设置写位置 SetCurDataSize((ushort)pData.Length); // 设置整个包实际的长度 SetPacketSize(); SetZip(true); } else { SetZip(false); } /// 进行加密 byte[] pKey = pCryp.GetKey(); if (null == pKey) { return; } // 按8字节对齐 uint wTemp = (uint)(8 - (GetCurDataSize() & 7)); // if (8 != wTemp) { WriteBytes(ref pKey, (uint)0, (uint)wTemp); } pCryp.Encryption(m_pData, GetDataSize()); SetCryp(true); SetPacketSize(); SetVerCode(); }