试图了解不同的CRC实现

时间:2014-06-20 04:17:55

标签: crc crc32 crc16

取自IEEE 802.3,

在数学上,对应于给定MAC帧的CRC值由以下过程定义:

  

a)帧的前32位被补充   b)然后将受保护字段的n位视为          系数n - 1的多项式M(x)的系数。(第一位          目标地址字段的对应于x(n-1)项和最后一项          MAC客户端数据字段的位(或Pad字段,如果存在)对应于          x0术语。)
  c)M(x)乘以x32并除以G(x),产生度数≤31的余数R(x)。   d)R(x)的系数被认为是32位序列   e)比特序列被补充,结果是CRC。

https://www.kernel.org/doc/Documentation/crc32.txt

以这种方式编写的大端CRC将编码如下:

for (i = 0; i < input_bits; i++) {
    multiple = remainder & 0x80000000 ? CRCPOLY : 0;
    remainder = (remainder << 1 | next_input_bit()) ^ multiple;
}

哪里是 c部分)M(x)乘以x ^ 32 我没有看到任何数字附加32个零。

以下一段代码对我来说毫无意义。代码和数学并不匹配。

Evaluating the differences in CRC-32 implementations

unsigned short
crc16_update(unsigned short crc, unsigned char nextByte)
{
    crc ^= nextByte;

    for (int i = 0; i < 8; ++i) {
        if (crc & 1)
            crc = (crc >> 1) ^ 0xA001;
        else
            crc = (crc >> 1);
    }

    return crc;
}

这些实现在做什么?它们都不像原来的程序。

即使阅读完毕后仍然没有意义: http://www.relisoft.com/science/crcmath.html

1 个答案:

答案 0 :(得分:1)

This tutorial(对于那些会抱怨链接腐烂的人来说,hereherehere,特别是&#34; 10。一个略微受管理的表驱动实现&#34;,很好地解释了优化,以避免在最后添加额外的32个零位。

最重要的是你将这些位输入到寄存器的末尾而不是开始,这与在末尾输入寄存器长度为零的效果相同。

本教程还很好地展示了您引用的实现如何实现GF(2)上的长除法。