我需要NFC標籤的CRC16實現。正如標準告訴我的那樣,這是ISO/IEC13239,並提供了示例C代碼。 我翻譯這個代碼轉換成Java,但它給了我錯誤的結果:ISO/IEC13239 CRC16實施
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;
}
作爲標準告訴我的1,2,3,4
字節序列應該創建0x3991
AC版本的CRC值是這裏第42頁:http://www.waazaa.org/download/fcd-15693-3.pdf
而且其他CRC實現不起作用:crc16 implementation java 第一個給我0x9e33
,第二0x0FA1
(我實現的方式說0xE1E5
)
是否有人在我的示例中發現錯誤,或者是否有另一個CRC16實現真的起作用?
CRC需要使用變量16位寬和無符號操作。你的變量crc_current_value是一個字符。您還需要大量的工作來查看例程... – guga
您需要了解的是,使用預先計算的表格有比這更快的算法。 – EJP
@EJP:你指的是鏈接中的一個?這給了我完全不同的結果... – reox