ISO / IEC13239 CRC16实施

我需要NFC标签的CRC16实现。正如标准告诉我的那样,这是ISO / IEC13239,并提供了示例C代码。我将此代码翻译成Java,但结果却是错误的:

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实现java 第一个给我0x9e33,第二个给我0x0FA1(顺便说一句,我的实现0xE1E5

有人在我的样本中发现错误,还是真的有用的另一个CRC16实现?

回答:

您的答案非常接近,但是我认为屏蔽和多项式可能存在一些问题。以下一些调整似乎对我有用:

private static final int POLYNOMIAL   = 0x8408;

private static final int PRESET_VALUE = 0xFFFF;

public static int crc16(byte[] data)

{

int current_crc_value = PRESET_VALUE;

for (int i = 0; i < data.length; i++ )

{

current_crc_value ^= data[i] & 0xFF;

for (int j = 0; j < 8; j++)

{

if ((current_crc_value & 1) != 0)

{

current_crc_value = (current_crc_value >>> 1) ^ POLYNOMIAL;

}

else

{

current_crc_value = current_crc_value >>> 1;

}

}

}

current_crc_value = ~current_crc_value;

return current_crc_value & 0xFFFF;

}

以上是 ISO / IEC13239 CRC16实施 的全部内容, 来源链接: utcz.com/qa/428253.html

回到顶部