Расчет по NMEA контрольная сумма

у меня проблема с вычислением контрольной суммы для предложений NMEA. Я использую следующий код java:

private static String getSum(String in) {
    int checksum = 0;
    if (in.startsWith("$")) {
        in = in.substring(1, in.length());
    }

    int end = in.indexOf('*');
    if (end == -1)
        end = in.length();
    for (int i = 0; i < end; i++) {
        checksum = checksum ^ in.charAt(i);
    }
    String hex = Integer.toHexString(checksum);
    if (hex.length() == 1)
        hex = "0" + hex;
    return hex.toUpperCase();
}

этот код похож на многие другие примеры в интернете и все работает нормально, пока я не попробую такое предложение..

$PSRF101,-2686700,-4304200,3851624,96000,497260,921,12,3*1C

это предложение из справочное руководство NMEA и поэтому я предполагаю, что контрольная сумма будет правильной. Но когда я вычисляю его, я получаю *2F как контрольную сумму, а не 1С.

Я думаю, что это из-за отрицательных значений в предложении, но я понятия не имею, как с ними бороться. У кого-нибудь есть предложения?

1 ответов


разница между предполагаемой и рассчитанной контрольными суммами равна пропуску (или иметь дополнительный символ '3'); поэтому я бы соблазнился поверить в ошибку в справочном руководстве NMEA.

вы можете попробовать некоторые онлайн калькулятор NMEA для проверки результатов.
например http://www.hhhh.org/wiml/proj/nmeaxor.html