Алгоритм контрольной суммы, приводящий к непредсказуемым результатам - PullRequest
1 голос
/ 07 сентября 2011

Я работаю над алгоритмом контрольной суммы, и у меня возникли некоторые проблемы.Когда я вручную создаю «фальшивое» сообщение, существенно меньшее, чем «реальные» данные, которые я получаю, я получаю правильную контрольную сумму.Однако в сравнении с реальными данными - контрольная сумма не работает должным образом.

Вот некоторая информация о входящих данных / среде:

  • Это отличный проект (см. Код ниже)
  • Все байты должны рассматриваться как целые числа без знака с целью вычисления контрольной суммы
    • Вы заметите некоторую путаницу с короткими и длинными значениями, чтобы заставить это работать.
  • Размер реальных данных составляет 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);
}

Если кто-нибудь сможет найти что-нибудьВ этом алгоритме, который может вызвать отклонение от ожидаемого результата, я был бы очень признателен за помощь в отслеживании этого.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

Ваша контрольная сумма будет увеличиваться до тех пор, пока она не станет отрицательной (так как это целое число со знаком)

Вы также можете сократить свой метод до:

public void addToChecksum( byte[] bytes) {
  //if the checksum isn't enabled, don't add
  if(!checksumEnabled) {
    return;
  }

  long previouschecksum =  this.checksum;
  this.checksum += bytes.inject( 0L ) { tot, it -> tot += it & 0xFF }

  if(this.checksum < previouschecksum) {
    logger.error("Checksum DECREASED: " + this.checksum);
  }
  //logger.info("Checksum: " + this.checksum);
}

Но это победилоне перестань быть негативным.Ради экономии 12 байт на элемент, для которого вы генерируете хеш, я бы все же предложил что-то вроде MD5, которое, как известно, работает, вероятно, лучше, чем ваш собственный ... Однако я понимаю, что иногда есть сумасшедшие требования, которые вы должны выполнитьпридерживаться ...

0 голосов
/ 07 сентября 2011

Я не вижу строки в вашем коде, где вы сбрасываете this.checksum.

Таким образом, вы всегда должны получить this.checksum > previouschecksum, верно?Это предназначено?

В противном случае я не могу найти изъян в вашем коде выше.Возможно, ваш 'this.checksum' имеет неправильный тип (например, сокращение).Это может привести к опрокидыванию, так что вы получите отрицательные значения.

Вот пример такого поведениядлина вашего ввода.

...