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) 如下:
根据余数的状态,就可以判定传送的数据信息是否正确。
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除”。
计算的竖式如下图的左式:

那么,(n, k)码 = M(x) * x3 + R(x) = 1100 000 + 010 = 1100 010。
4.CRC 的验证
还是利用上面的例题来说明验证的方法。
当收到的代码是:1100 010,按照同样的方法求余数,竖式如上图中的右式。
余数为 0,就说明数据传输是正确的。
5.用 CRC 的检错
当有一位数是错误的,模2除的余数,就不是 0 了,可见下面的竖式:

可以看出,发生错误的位置不同,余数也不同。
使用不同的信息码 M(x) 来实验,能够看出,错误位置和余数的关系是固定的,不会因为信息码的不同而变化。
如果知道了错误的位置,是不是就可以纠错呢?不可,因为难以确定错误是不是仅仅有一位,错了更多的位,余数并不会对此有所表现。
因此,有人说利用 CRC 的方法可以纠错,这是不对的,CRC 只能用于检错,不能用于纠错。
CRC 检错的能力和生成多项式的位数有关,位数越多,检错的概率越高。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/40220.html