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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage