我正在研究校验和算法,但遇到了一些问题。更重要的是,当我手工制作一个比我收到的“真实”数据小得多的“假”消息时,我得到了一个正确的校验和。但是,针对真实数据 - 校验和无法正常工作。
以下是有关传入数据/环境的一些信息:
- 这是一个 groovy 项目(见下面的代码)
- 出于校验和计算的目的,所有字节都将被视为无符号整数
- 你会注意到一些短裤和多头的东西,以使这项工作发挥作用。
- 实际数据的大小为 491 字节。
- 我的样本数据(似乎添加正确)的大小是 26 字节
- 据我所知,我的十六进制到十进制转换都没有产生负数
- 文件中的某些字节不会添加到校验和中。我已经验证了这些开关是否正常工作,以及何时应该正常工作 - 所以这不是问题。
- 我计算出来的校验和,和实际传输的校验和总是相差相同的数量。
- 我已经手动验证了与真实数据打包的校验和是正确的。
这是代码:
// add bytes to checksum
public void addToChecksum( byte[] bytes) {
//if the checksum isn't enabled, don't add
if(!checksumEnabled) {
return;
}
long previouschecksum = this.checksum;
for(int i = 0; i < bytes.length; i++) {
byte[] tmpBytes = new byte[2];
tmpBytes[0] = 0x00;
tmpBytes[1] = bytes[i];
ByteBuffer tmpBuf = ByteBuffer.wrap(tmpBytes);
long computedBytes = tmpBuf.getShort();
logger.info(getHex(bytes[i]) + " = " + computedBytes);
this.checksum += computedBytes;
}
if(this.checksum < previouschecksum) {
logger.error("Checksum DECREASED: " + this.checksum);
}
//logger.info("Checksum: " + this.checksum);
}
如果有人能在这个算法中找到任何可能导致偏离预期结果的东西,我将非常感谢您帮助追踪这一点。