/// <summary> /// 二进制数据 转成 内容包数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public JT808_PackageData Bytes2PackageData(byte[] data) { JT808_PackageData ret = new JT808_PackageData(); // 1. 16byte 或 12byte 消息头 JT808_PackageData.MsgHeader msgHeader = this.ParseMsgHeaderFromBytes(data); ret.msgHeader = msgHeader; int msgBodyByteStartIndex = 12 + 1; // 2. 消息体 // 有子包信息,消息体起始字节后移四个字节:消息包总数(word(16))+包序号(word(16)) if (msgHeader.hasSubPackage) { msgBodyByteStartIndex = 16 + 1; } byte[] tmp = new byte[msgHeader.msgBodyLength]; Buffer.BlockCopy(data, msgBodyByteStartIndex, tmp, 0, tmp.Length); ret.setMsgBodyBytes(tmp); // 3. 去掉分隔符之后,最后一位就是校验码 int checkSumInPkg = data[data.Length - 1 - 1]; int calculatedCheckSum = ExplainUtils.getCheckSum4JT808(data, 0 + 1, data.Length - 1 - 1); ret.checkSum = (checkSumInPkg); if (checkSumInPkg != calculatedCheckSum) { ret.errorlog = ret.errorlog + "检验码不一致;";// string.Format("检验码不一致,msgid:{},pkg:{},calculated:{}", msgHeader.getMsgId(), checkSumInPkg, calculatedCheckSum); } return(ret); }