微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

0x04C11DB7L 如何表示多项式?

如何解决0x04C11DB7L 如何表示多项式?

我正在查看 CRC,并偶然发现:https://www.naaccr.org/wp-content/uploads/2017/12/C-API-Implementation-CRC32.c

我知道 CRC 需要有一个“神奇”的多项式来为 CRC 生成查找表。我看到“多项式”的参数是:

0x04C11DB7L 

这个值如何表示多项式?

解决方法

对我来说,表示多项式是一种非常优雅的方式。它的工作方式如下:

您有一个十六进制数,例如0x04C11DB7。可以转换成二进制数:0b100110000010001110110110111.

让我们将每一位视为 x 的相应幂之前的系数。最低有效位对应于 0 次方(即项 1)。此外,在二进制表示中省略了最大幂,在我们的例子中十六进制数是 32 位长,因此省略了 x 的 32 次幂。

现在我们可以写下通过 0x04C11DB7 表示的多项式:

x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

,

您提到的常量作为此评论的一部分出现在源代码中:

/* The following CRC lookup table was generated automagically    */
/* by the Rocksoft^tm Model CRC Algorithm Table Generation       */
/* Program V1.0 using the following model parameters:            */
/*                                                               */
/*    Width   : 4 bytes.                                         */
/*    Poly    : 0x04C11DB7L                                      */
/*    Reverse : TRUE.                                            */
/*                                                               */
/* For more information on the Rocksoft^tm Model CRC Algorithm,*/
/* see the document titled "A Painless Guide to CRC Error        */
/* Detection Algorithms" by Ross Williams                        */

将该论文名称和作者插入搜索引擎,结果出现了 the author's "CRC Pitstop" website(自 1996 年以来一直未受影响!),其中包含 a copy of the paper in question

它描述了 CRC 算法使用的“多项式算术”,但随后指出您实际上并不需要了解理论的那部分来理解或实现算术本身。

关键操作其实只是除法的一种特殊形式,需要选择的自由参数是除数,校验和是余数 输入除以该参数后。

在表生成算法中使用“Poly”作为参数名称,结果证明不是一般的缩写,而是故意选择术语来淡化多项式算法的作用:

要执行 CRC 计算,我们需要选择一个除数。在数学营销中,除数称为“生成多项式”或简称为“多项式”,是任何 CRC 算法的关键参数。将除数称为其他名称可能会更友好,但多角谈话在该领域根深蒂固,以至于现在避免使用它会令人困惑。作为妥协,我们将 CRC 多项式称为“poly”。把这个数字想象成一种鹦鹉。 “你好保利!”

因此,该参数远不是“用于导出查找表的神奇多项式”,而是您将在除法运算中使用的简单数字。正如论文继续描述的那样,查找表只是优化长除法的一种方式 - 本质上,这些值是“poly”移位的各种副本,并相互异或以处理输入的多个位一下子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。