校验码:
规则:
校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。
java实现代码:
/** * 根据byteBuf的readerIndex和writerIndex计算校验码 * 校验码规则:从消息头开始,同后一字节异或,直到校验码前一个字节,占用 1 个字节 * @param byteBuf * @return */ public static byte XorSumBytes(ByteBuf byteBuf) { byte sum = byteBuf.getByte(byteBuf.readerIndex()); for (int i = byteBuf.readerIndex() + 1; i < byteBuf.writerIndex(); i++) { sum = (byte) (sum ^ byteBuf.getByte(i)); } return sum; }
判断依据:
//校验 ByteBuf escape 为netty读取的原始报文 byte pkgCheckSum = escape.getByte(escape.writerIndex() - 1); escape.writerIndex(escape.writerIndex() - 1);//排除校验码 byte calCheckSum = JT808Util.XorSumBytes(escape); if (pkgCheckSum != calCheckSum) { log.warn("校验码错误,pkgCheckSum:{},calCheckSum:{}", pkgCheckSum, calCheckSum); ReferenceCountUtil.safeRelease(escape); return null; }
字符串位数不够自动实现补充0:
String str= StringUtils.leftPad("123", 12, "0"); //不足前补0 String str1= StringUtils.rightPad("123", 12, "0");//不足后补0