如何用多项式 x16 + x12 + x5 + 1 计算 CRC 16

Posted

技术标签:

【中文标题】如何用多项式 x16 + x12 + x5 + 1 计算 CRC 16【英文标题】:How to calculate CRC 16 with polynomial x16 + x12 + x5 + 1 【发布时间】:2013-02-21 05:42:32 【问题描述】:

我正在尝试与某些系统交互,并且在他们的规范中,他们需要计算 CRC 16 以进行串行通信。这是文档的摘录

“使用标准多项式的消息的 16 位 CCITT CRC,X16 +X12 +X5 +1。种子值始终为 0(零)”

首先,我只找到了 2-3 个 C# 代码示例来说明如何执行此操作,但似乎都没有给我正确的值。我试过这个http://www.sanity-free.com/133/crc_16_ccitt_in_csharp.html,但我不确定为初始值设置什么。我尝试了零,但仍然无法正常工作。

我正在测试它的数据是:

0x00 0x09 0x10 0x01 0x01 0x7C 0xF4 0xB8 0x00, 

我得到的CRC值是

0xF2 0x24, 

但是他们的系统说它应该是

0xC0 0x2F

我的理解是多项式 x16 + x12 + x5 + 1 = 0x11021,但是即使我在代码中使用它,它仍然给我错误的答案。我做错了什么?

【问题讨论】:

【参考方案1】:

我想通了。我不得不使用 CRC16-CCITT Kermit 实现。我认为他们的文档需要更新,因为它使用了不同的多项式。

http://www.sanity-free.com/147/standard_crc16_and_crc16_kermit_implementation_in_csharp.html

【讨论】:

不,它是同一个多项式。 CRC 实现使用位反转多项式是很常见的。 0x1021 反转为 0x8408。 CRC16-CCITT Kermit CRC 的描述位于 reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.kermit ,其中注明了反射。

以上是关于如何用多项式 x16 + x12 + x5 + 1 计算 CRC 16的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Java2D 绘制内部笔画

如何用Matlab进行多项式除法运算

如何用Matlab进行多项式除法运算

如何用 Python 和 sklearn 编写多元对数回归?

如何用C语言实现一元多项式简单计算器的设计

整数规划该如何用MATLAB求解?