用于船载 AIS 的 CRC16-CCITT

CRC16-CCITT for shipborne AIS

我正在尝试解码 AIS 传输并通过检查 CRC 代码来验证它。 但是,我不确定步骤的顺序,也不确定预期的结果。 我的问题是,谁能告诉我使用 CRC 验证 AIS 数据包的正确步骤顺序?

我正在按照本指南第 2 页上的 link 图层顺序进行操作,顺序相反:https://fidus.com/wp-content/uploads/2016/03/Guide_to_System_Development_March_2009.pdf

我的步骤是:

  1. 从 FM 解调器获取比特流
  2. NRZI 解码
  3. 找到开始和停止标志并提取它们之间的数据包
  4. 从数据包中删除填充位
  5. 将数据包拆分为字节并反转每个字节,使第 0 位变为第 7 位。
  6. 从数据包末尾取出 16 位 CRC。

那么我希望其中一件事情是真的:

但是我无法得到符合任何预期的结果,而且即使我确定它们都是有效的,我也无法得到两条消息来产生相同的输出。

我正在使用多项式 0x8408 和初始填充 0xFFFF 的 CRC-16 CCITT。我也从 RTL-AIS 的源代码中获取了这些参数。我试图从该资源中了解更多信息,但它写得密密麻麻且没有注释,我无法理解。我不确定 CRC 过程本身是否涉及进一步的逆转。

我已经尝试对我能找到的其他来源的数据进行 CRC 处理,但没有成功。 (https://www.dsprelated.com/showthread/comp.dsp/79522-1.php 显示了他们的数据并声称成功,并解释了位序反转,但我无法复制它)。

来自 post 的数据是: 000010000000000000000000000000111111111111110101010101111111111111111111111111110111011101110111111111111111111111111111111111110110110111111111111011111011101111111111111111111111110000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000001110 [= 13 = 13 =]

校验和是: 1110100000011111

使用此在线 CRC 工具 https://crccalc.com/,我无法得出相同的结果。谁能告诉我怎么做?

感谢 rcgldr 教我最终的 XOR 值!

我在线使用了这个 CRC 计算器:http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

我使用了 CRC-16 无输入反射,无结果反射,多项式 0x1021,初始填充 0xFFFF,最终异或值 0xFFFF。

关于步骤的顺序,必须在应用任何位或字节顺序更改之前对直接从 unstuffer 中取出的位执行此计算。

根据我的问题中的数据,这些参数生成的 CRC 结果 0xE81F 与我问题中的校验和相匹配。

多项式 0x1021 来自 CRC16-CCITT 规范。

在 RTL-AIS 源代码和其他继承它的项目中,多项式 0x8408 与一些未知的位和字节顺序更改序列一起使用。这对我来说仍然是个谜。对于以后的reader,我建议复制我在这里所做的,因为它更简单!

再次感谢,我已经和这个问题斗争了好几个星期了。