Als alter C-Hase bin ich gerade dabei, ein Programm in Java zu
schreiben, das über Bluetooth gesendete Daten empfängt. Der Datenblock
steht in einem Byte-Array mit 10 Elementen. Die letzten beiden Elemente
enthalten High- bze. Low byte des CRC. Den CRC berechne ich mit der
statischen Methode crc16 einer Klasse namens CRC, die selbstverständlich
die letzten beiden Bytes auslässt. Das funktioniert und der so
berechnete CRC stimmt mit dem übertragenen überein. Trotzdem wirft er
mich häufig - aller
dings nicht immer - mit einer CRCException raus:
1 | short crc = CRC.crc16(response);
|
2 | if ((response[8] != (crc >>> 8)) || (response[9] != (crc & 0xFF))) {
|
3 | throw new CRCException("CRC error");
|
4 | }
|
Der Fehler scheint immer dann aufzutreten, wenn eines der Bytes > 127
ist. Anscheinend hat das irgendetwas mit dem Vorzeichen zu tun,
vermutlich wandelt Java den Datentyp vor dem Vergleich vorzeichenrichtig
in einen anderen um. Andererseits sollt ">>>" im Gegensatz zu ">>" ja
gerade logisch und nicht arithmetisch schieben. Wie löst man das
Problem?
PS: In C wäre das mit "unsigned short" bzw. "uint16_t" sauber und
elegant gelöst. Leider gibt es in Java keine unsigned Datentypen.