Я работаю над алгоритмом контрольной суммы, и у меня возникли проблемы. Проблема в том, что когда я вручную создаю «фальшивое» сообщение, которое существенно меньше «реальных» данных, которые я получаю, я получаю правильную контрольную сумму. Однако вопреки реальным данным - контрольная сумма работает некорректно.
Вот некоторая информация о входящих данных / среде:
- Это отличный проект (см. Код ниже)
- All bytes are to be treated as unsigned integers for the purpose of checksum calculation
- You'll notice some finagling with shorts and longs in order to make that work.
- Размер реальных данных составляет 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);
}
Если кто-нибудь может найти в этом алгоритме что-либо, что может вызвать отклонение от ожидаемого результата, я был бы очень признателен за вашу помощь в отслеживании этого.