public override ParserResult Parse() { ParserResult result = null; if (data.Length > MinSizeDataPacket) { var startByteList = new TrackerTypeData.TypePacketData[] { TrackerTypeData.TypePacketData.Answer, TrackerTypeData.TypePacketData.AsyncData, TrackerTypeData.TypePacketData.Request }; var startByteIndex = 0; while (startByteIndex < startByteList.Length) { var startByte = Array.IndexOf(data, (byte)startByteList[startByteIndex]); if (startByte != -1) { var lenWholePacket = BitConverter.ToUInt16(data, (int)TrackerTypeData.PacketField.PacketLenByteL); byte[] crcArray = new byte[lenWholePacket - 2]; if (data.Length >= crcArray.Length) { Array.Copy(data, 0, crcArray, 0, crcArray.Length); if (CrcCalc.Crc16(crcArray) == BitConverter.ToUInt16(data, lenWholePacket - 2)) { var packet = (TrackerTypeData.TypePacketData)(int) data[(int)TrackerTypeData.PacketField.PacketHeaderIndex]; var typeMessage = (TrackerTypeData.TypeMessage)data[(int)TrackerTypeData.PacketField.PacketTypeMessageIndex]; var paramCount = data[(int)TrackerTypeData.PacketField.PacketParamCountIndex]; var bodyData = ParseField(data, (int)TrackerTypeData.PacketField.PacketStartDataInPacketIndex, paramCount); result = new ParserResult(packet, bodyData, typeMessage); } else { return(null); } } } startByteIndex += 1; } } return(result); }
public ParserResult(TrackerTypeData.TypePacketData _type, List <DataItemParam> _data, TypeMessage _typeMessage) { type = _type; data = _data; typeMessage = _typeMessage; }