//合并分段 private void MergeSegment(byte[] buff, UInt32 buffindex, UInt32 PacketLength) { const UInt16 CommnadSize = 2; //命令大小 const UInt16 ConnectSize = 12; //连接大小 const UInt16 DataidSize = 4; //数据块编号大小 const UInt16 DataLengthSize = 4; //数据块长度大小 const UInt16 DataOffsetSize = 4; //数据块偏移大小 const UInt16 PacketHead = CommnadSize + ConnectSize + DataidSize + DataLengthSize + DataOffsetSize; UInt32 segmentlength; int command = buff[buffindex] + (buff[buffindex + 1] << 8); if (command != (int)COMMAND_ID.COMMAND_PACKET) { ParseData(buff, buffindex, PacketLength); } else { UInt32 datalength = BitConverter.ToUInt32(buff, (int) buffindex + CommnadSize + ConnectSize + DataidSize); //总数据块大小 if (PacketLength == datalength + PacketHead) //未分段 ParseData(buff, buffindex, PacketLength); else { UInt16 sourserverid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize); UInt16 sourappid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize + 4); UInt32 dataid = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + 12); PacketKey key = new PacketKey() { serverid = sourserverid, appid = sourappid, dataid = dataid }; UInt32 offset = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + ConnectSize + DataidSize + DataLengthSize); if(!bigsegmentbuff.ContainsKey(key)) { byte[] b = new byte[datalength + PacketHead + 4]; // 前4字节为已接受多少数据 bigsegmentbuff.Add(key, b); Array.Copy(buff, buffindex, bigsegmentbuff[key], 4, PacketLength); bigsegmentbuff[key][0] = (byte)(PacketLength); bigsegmentbuff[key][1] = (byte)(PacketLength >> 8); bigsegmentbuff[key][2] = (byte)(PacketLength >> 16); bigsegmentbuff[key][3] = (byte)(PacketLength >> 24); } else { segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0); Array.Copy(buff, buffindex + PacketHead, bigsegmentbuff[key], offset + PacketHead + 4, PacketLength - PacketHead); segmentlength = segmentlength + PacketLength - PacketHead; bigsegmentbuff[key][0] = (byte)(segmentlength); bigsegmentbuff[key][1] = (byte)(segmentlength >> 8); bigsegmentbuff[key][2] = (byte)(segmentlength >> 16); bigsegmentbuff[key][3] = (byte)(segmentlength >> 24); } segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0); if (segmentlength == bigsegmentbuff[key].Length - 4) //最后一个段 { ParseData(bigsegmentbuff[key], 4, segmentlength); bigsegmentbuff.Remove(key); } } } }
//合并分段 private void MergeSegment(byte[] buff, UInt32 buffindex, UInt32 PacketLength) { const UInt16 CommnadSize = 2; //命令大小 const UInt16 ConnectSize = 12; //连接大小 const UInt16 DataidSize = 4; //数据块编号大小 const UInt16 DataLengthSize = 4; //数据块长度大小 const UInt16 DataOffsetSize = 4; //数据块偏移大小 const UInt16 PacketHead = CommnadSize + ConnectSize + DataidSize + DataLengthSize + DataOffsetSize; UInt32 segmentlength; int command = buff[buffindex] + (buff[buffindex + 1] << 8); if (command != (int)COMMAND_ID.COMMAND_PACKET) { ParseData(buff, buffindex, PacketLength); } else { UInt32 datalength = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + ConnectSize + DataidSize); //总数据块大小 if (PacketLength == datalength + PacketHead) //未分段 { ParseData(buff, buffindex, PacketLength); } else { UInt16 sourserverid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize); UInt16 sourappid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize + 4); UInt32 dataid = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + 12); PacketKey key = new PacketKey() { serverid = sourserverid, appid = sourappid, dataid = dataid }; UInt32 offset = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + ConnectSize + DataidSize + DataLengthSize); if (!bigsegmentbuff.ContainsKey(key)) { byte[] b = new byte[datalength + PacketHead + 4]; // 前4字节为已接受多少数据 bigsegmentbuff.Add(key, b); Array.Copy(buff, buffindex, bigsegmentbuff[key], 4, PacketLength); bigsegmentbuff[key][0] = (byte)(PacketLength); bigsegmentbuff[key][1] = (byte)(PacketLength >> 8); bigsegmentbuff[key][2] = (byte)(PacketLength >> 16); bigsegmentbuff[key][3] = (byte)(PacketLength >> 24); } else { segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0); Array.Copy(buff, buffindex + PacketHead, bigsegmentbuff[key], offset + PacketHead + 4, PacketLength - PacketHead); segmentlength = segmentlength + PacketLength - PacketHead; bigsegmentbuff[key][0] = (byte)(segmentlength); bigsegmentbuff[key][1] = (byte)(segmentlength >> 8); bigsegmentbuff[key][2] = (byte)(segmentlength >> 16); bigsegmentbuff[key][3] = (byte)(segmentlength >> 24); } segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0); if (segmentlength == bigsegmentbuff[key].Length - 4) //最后一个段 { ParseData(bigsegmentbuff[key], 4, segmentlength); bigsegmentbuff.Remove(key); } } } }