CRC 的简介

来源:互联网 发布:算法竞赛宝典淘宝 编辑:程序博客网 时间:2024/06/05 18:46

CRC,Cyclic Redundancy Check,中文称为“循环冗余校验”。
它的应用很广,一般常见的说法都是用于通信。其实,在压缩、解压文件的时候,也普遍用到了它。
另外,单片机系统在掉电时,一般都要把当前有用的状态信息,保存在 EEPROM 中,为了保证信息的正确,也可以用 CRC 来检验。

1.CRC 的作用

还是用通信来说明 CRC 的作用。

由于线路上的干扰,通信时可能会有错码,那么当接收方收到了信息,怎么来确认这些信息就是正确的呢?
为了确认通信的正确性,发送方还要在信息之后,再发送一组“校验码”,这些校验码,是用前面的信息数据算出来的。
接收方收到信息数据和校验码之后,再按照同样的算法来计算,如果结果符合规则,就认为这次数据传输是正确的。

2.CRC 的计算规则

设信息数据 M(x)有 k 位,后面的 CRC 校验码为 r 位,那么总共发送的位数则为 n = k + r 位,因此,这种编码又叫(n, k)码。

利用 k 位信息码,求取 r 位 CRC 码时,需要先确定一个“生成多项式 G(x)”。

G(x) 也是一个二进制数,要求最高位和最低位都是 1 才行。

在不同的标准里面,G(x)的数值是不同的。常见的 G(x) 如下:

CRC-CCITT:  G(x) = X16 + X12 + X5 + 1 = 1 0001 0000 0010 0001 = 1 1021H
CRC-16:     G(x) = X16 + X15 + X2 + 1 = 1 1000 0000 0000 0101 = 1 8005H

CRC-32:     G(x) = X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1
                 = 1 0000 0100 1100 0001 0001 1101 1011 0111  = 04C1 1DB7H

选定了 G(x) 之后,就可以用信息数据 M(x) 除以 G(x),得出的余数 R(x) 就是 r 位的 CRC 码。
注意,这里使用除法是“模2除”,其实就是“异或”算法。

把 M(x) 和 r 位的 CRC 码合并在一起(即(n, k)码),再除以 G(x),得出的余数就是 0。
如果这组(n, k)码中含有错误,再除以 G(x),得出的余数就不是 0。

根据余数的状态,就可以判定传送的数据信息是否正确。

3.CRC 的算法举例

例:已知信息码为 M(x) = 1100,生成多项式 G(x) = x3 + x + 1,求 CRC 码,及(n, k)码。

解:

根据 G(x) = x3 + x + 1,可知除数为 1011;余数(CRC 码)应为 3 位二进制数。

那么,先在 M(x) 后面填写上 3 个 0,即为:1100 000,再用它“模2除” 1011。

现在填写的这些 0,将来是要用 CRC 码来填充,组成的(n, k)码的。这个步骤也可以写成:

    CRC 码 = M(x) * x3  /  G(x)

乘以 x3,就代表把 M(x) 左移 3 位,后面填上 3 个 0。 /,代表“模2除”。

计算的竖式如下图的左式:

 CRC 的简介 - 非著名博主 - 电子信息角落


在此得出的余数 R(x) = 010 即为 CRC 码。

那么,(n, k)码 = M(x) * x3 + R(x) = 1100 000 + 010 = 1100 010。

4.CRC 的验证

还是利用上面的例题来说明验证的方法。

当收到的代码是:1100 010,按照同样的方法求余数,竖式如上图中的右式。

余数为 0,就说明数据传输是正确的。

5.用 CRC 的检错

当有一位数是错误的,模2除的余数,就不是 0 了,可见下面的竖式:

 CRC 的简介 - 非著名博主 - 电子信息角落

可以看出,发生错误的位置不同,余数也不同。

使用不同的信息码 M(x) 来实验,能够看出,错误位置和余数的关系是固定的,不会因为信息码的不同而变化。

如果知道了错误的位置,是不是就可以纠错呢?不可,因为难以确定错误是不是仅仅有一位,错了更多的位,余数并不会对此有所表现。

因此,有人说利用 CRC 的方法可以纠错,这是不对的,CRC 只能用于检错,不能用于纠错。

CRC 检错的能力和生成多项式的位数有关,位数越多,检错的概率越高。

0 0
原创粉丝点击