gpt4 book ai didi

java - ISO/IEC13239 CRC16 实现

转载 作者:搜寻专家 更新时间:2023-11-01 01:53:29 25 4
gpt4 key购买 nike

我需要 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 的 CRC 值C 版本位于第 42 页:http://www.waazaa.org/download/fcd-15693-3.pdf

其他 CRC 实现也不起作用:crc16 implementation 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;
}

关于java - ISO/IEC13239 CRC16 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com