Mam problem z obliczeniem sumy kontrolnej dla zdań NMEA. Używam następujący kod Java:Obliczanie sumy kontrolnej NMEA
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();
}
Kod ten jest podobny do wielu innych przykładów w całym internecie i wszystko działa dobrze, dopóki próbuję zdanie tak ..
$PSRF101,-2686700,-4304200,3851624,96000,497260,921,12,3*1C
tym zdaniu pochodzi z NMEA Reference Manual i dlatego zakładam, że suma kontrolna będzie poprawna. Ale kiedy to policzę, otrzymuję * 2F jako sumę kontrolną, a nie 1C.
Myślę, że dzieje się tak z powodu ujemnych wartości w zdaniu, ale nie mam pojęcia, jak sobie z nimi poradzić. Czy ktoś ma sugestię?
Znak '-' nie robi różnicy: suma kontrolna nadal będzie wynosić' 2F' –
Niepoprawnie, każda postać wnosi swój wkład. Jeśli jednak zdejmiesz BOTH z kresek, zaczniesz XORing dwa razy ... co pozwoli ci wrócić tam, gdzie byłeś. Usunięcie jednego z nich całkowicie zmienia wynik. – Anders8