/// <summary> /// 从一段数据流中从前至后查找数据包,返回第一个数据包的位置,如果出现第一个未接收完整的疑似包, /// 而该疑似包之后没有再发现下一个数据包,则传出这个疑似包的结果。 /// </summary> /// <param name="data"></param> /// <param name="startIndex"></param> /// <returns></returns> private OnceFindResult FindPacketOnce(byte[] data, int startIndex) { OnceFindResult result = new OnceFindResult(); int startSuspect = 0; bool isFindSuspect = false; for (int i = startIndex; i < data.Length; i++) { result = PacketCheck(data, i); if (result.e == PacketError.Succeed) //如果当前位置判断成功,就直接传出结果 { return(result); } else if (result.e == PacketError.PacketReceiveing && isFindSuspect == false) { startSuspect = i; isFindSuspect = true; break; } else if (result.e == PacketError.PacketLengthTooShort && isFindSuspect == false) { startSuspect = i; isFindSuspect = true; break; } } if (isFindSuspect) { return(PacketCheck(data, startSuspect)); } else { return(result); } }
/// <summary> /// 检测测数据包是否正确的功能函数。输入一个判断位置,会检测包头,长度,包尾巴,然后返回结果。 /// </summary> /// <param name="PacketData"></param> /// <param name="startIndex"></param> /// <returns></returns> private OnceFindResult PacketCheck(byte[] PacketData, int startIndex = 0) { OnceFindResult reslut = new OnceFindResult(); reslut.startIndex = startIndex; if ((PacketData.Length - startIndex) < (head.Length + sizeof(int) + 0 + end.Length)) { reslut.e = PacketError.PacketLengthTooShort;//长度就小于最小长度 return(reslut); } //判断包头是否正确 else if (!CheckHead(PacketData, startIndex)) { reslut.e = PacketError.HeadError;//包头字节不对 return(reslut); } int length = GetLength(PacketData, startIndex);//从数据包中得到长度 if (startIndex + length > PacketData.Length) { reslut.e = PacketError.PacketReceiveing;//长度位数据不对,还未收完整 reslut.length = length; return(reslut); } if (!CheckEnd(PacketData, startIndex, length)) { reslut.e = PacketError.EndError;//包尾字节不对 return(reslut); } reslut.e = PacketError.Succeed; reslut.length = length; return(reslut); }
/// <summary> /// 输入一段有头尾的数据包,尝试拆出数据 /// </summary> private byte[] UnPack(byte[] PData, OnceFindResult result) { if (result.e == PacketError.Succeed) { byte[] data = new byte[result.length - head.Length - sizeof(int) - sizeof(uint) - end.Length]; Buffer.BlockCopy(PData, result.startIndex + head.Length + sizeof(int), data, 0, data.Length); return(data); } else { return(null); } }
byte[] IPacket.UnPack(byte[] sData, int startIndex) { OnceFindResult result = PacketCheck(sData, startIndex); if (result.e == PacketError.Succeed) { byte[] data = new byte[result.length - head.Length - sizeof(int) - sizeof(uint) - end.Length]; Buffer.BlockCopy(sData, result.startIndex + head.Length + sizeof(int), data, 0, data.Length); return(data); } else { return(null); } }
/// <summary> /// 检测测数据包是否正确的功能函数。输入一个判断位置,会检测包头,长度,包尾巴,然后返回结果。 /// </summary> /// <param name="PacketData"></param> /// <param name="startIndex"></param> /// <returns></returns> private OnceFindResult PacketCheck(byte[] PacketData, int startIndex = 0) { OnceFindResult reslut = new OnceFindResult(); reslut.startIndex = startIndex; if ((PacketData.Length - startIndex) < (head.Length + sizeof(int) + 0 + sizeof(uint) + end.Length)) { reslut.e = PacketError.PacketLengthTooShort;//长度就小于最小长度 return(reslut); } //判断包头是否正确 else if (!CheckHead(PacketData, startIndex)) { reslut.e = PacketError.HeadError;//包头字节不对 return(reslut); } int length = GetLength(PacketData, startIndex); if (startIndex + length > PacketData.Length) { reslut.e = PacketError.PacketReceiveing;//长度位数据不对,还未收完整 reslut.length = length; return(reslut); } if (!CheckEnd(PacketData, startIndex, length)) { reslut.e = PacketError.EndError;//包尾字节不对 return(reslut); } //如果设置进行CRC校验才进行校验,否则不校验。 if (isCheckCRC) { uint crc = GetCRC(PacketData, startIndex, length); if (crc != Crc32.Crc(PacketData, startIndex, length - end.Length - sizeof(uint))) { reslut.e = PacketError.CRCError;//CRC错误 return(reslut); } } reslut.e = PacketError.Succeed; reslut.length = length; return(reslut); }