Implementierung von ISO / IEC13239 CRC16
Ich benötige eine CRC16-Implementierung für NFC-Tags. Wie der Standard sagt, handelt es sich um ISO / IEC13239, und es wird ein Beispiel-C-Code bereitgestellt. Ich habe diesen Code in Java übersetzt, aber es gibt mir falsche Ergebnisse:
private static final char POLYNOMIAL = 0x8404;
private static final char PRESET_VALUE = 0xFFFF;
public static int crc16(byte[] data) {
char current_crc_value = PRESET_VALUE;
for (int i = 0; i < data.length; i++) {
current_crc_value = (char) (current_crc_value ^ ((char) data[i]));
for (int j = 0; j < 8; j++) {
if ((current_crc_value & 0x0001) == 0x0001) {
current_crc_value = (char) ((current_crc_value >>> 1) ^ POLYNOMIAL);
} else {
current_crc_value = (char) (current_crc_value >>> 1);
}
}
}
current_crc_value = (char) ~current_crc_value;
return current_crc_value;
}
Wie der Standard sagt mir eine Bytesequenz von1,2,3,4
sollte einen CRC-Wert von erstellen0x3991
Eine C-Version finden Sie hier auf Seite 42:http://www.waazaa.org/download/fcd-15693-3.pdf
Auch andere CRC-Implementierungen funktionieren nicht:crc16 implementierung java Das erste gibt mir0x9e33
, der Zweite0x0FA1
(meine umsetzung sagt übrigens0xE1E5
)
Findet jemand einen Fehler in meinem Beispiel oder gibt es eine andere CRC16-Implementierung, die wirklich funktioniert?