当前位置: 首页 > 面试题库 >

ISO / IEC13239 CRC16实施

单于楚
2023-03-14
问题内容

我需要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 Master 是一个易用的光盘镜像文件(ISO)编辑器,通过它可以从ISO中提取文件、添加文件到ISO、创建可引导的ISO文件等等。

  • 以下是ISO代码,Microsoft代码和Macintosh代码之间的语言代码对应关系的草稿列表。 此信息的来源是Unicode Consortium。 语言代码:ISO 639,Microsoft 语言 ISO代码 Windows名称 赢码 Abkhazian ab Afar aa Afrikaans af LANG_AFRIKAANS 0x36 Albanian sq LANG_ALBANIA

  • 对于 CLI 老鸟来说,挂载 ISO 镜像根本无需第三方程序,只需下面一行命令就可搞定。 sudo mount -o loop /path/to/foo.iso /mnt 但对于很多适应了图形化工具的新手来说,他们更想要的是能有一款图形化工具来解决这一问题,而 Furius ISO Mount 就是这样一个工具,可以帮助对 CLI 命令不太熟悉的用户来挂载 ISO 光盘镜像文件。 它支持 ISO,

  • 主要内容:ISO-8859-1,HTML 预留字符,ISO 8859-1 字符实体现代的浏览器支持的字符集: ASCII 字符集 标准 ISO 字符集 数学符号、希腊字母、其他符号 ISO-8859-1 ISO-8859-1 是大多数浏览器默认的字符集。 ISO-8859-1 的较低部分(从 1 到 127 之间的代码)是最初的 ASCII 字符集(0-9 的数字,大写和小写英文字母表,以及一些特殊字符)。 ISO-8859-1 的较高部分(从 160 到 255 之间的代码)

  • Unicode是ISO-8859-1的超集,因此前256个Unicode字符对应于ISO-8859-1。

  • 我的API使用ISO 8601向客户表示时间。我们有一个功能,我们希望显示它来自哪个时区。通过纯粹存储时区偏移,我们失去了对该细节的跟踪。 即,犹他州和亚利桑那州在一年中的一半时间遵守MST,犹他州在另一半时间切换到MDT。我们目前的解决方案是确定日期是否在夏令时,并在夏令时使用时区,否则使用,但亚利桑那州的ISO 8601日期将导致太平洋夏令时。 有没有办法指定是否以ISO 8601格式观察夏令