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除”。
计算的竖式如下图的左式:
在此得出的余数 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 了,可见下面的竖式:
可以看出,发生错误的位置不同,余数也不同。
使用不同的信息码 M(x) 来实验,能够看出,错误位置和余数的关系是固定的,不会因为信息码的不同而变化。
如果知道了错误的位置,是不是就可以纠错呢?不可,因为难以确定错误是不是仅仅有一位,错了更多的位,余数并不会对此有所表现。
因此,有人说利用 CRC 的方法可以纠错,这是不对的,CRC 只能用于检错,不能用于纠错。
CRC 检错的能力和生成多项式的位数有关,位数越多,检错的概率越高。
- CRC 的简介
- CRC原理简介
- CRC算法的实现...
- CRC 的应用
- CRC校验的算法
- CRC算法的原理
- CRC card的用法
- CRC校验的实现
- CRC的校验原理
- 能看懂的CRC
- CRC校验码的源代码
- CRC的校验原理
- CRC的校验原理
- crc的生成
- CRC的校验原理
- CRC TABLE的创建
- CRC 的应用
- CRC的校验原理
- 51单片机汇编语言--延时程序的延时时间
- 很好的c++和Python混合编程文章
- 80x86汇编语言编程--
- 找出所有n的平方具有对称性质(也称回文数)的数
- 直接写屏
- CRC 的简介
- ExpandableListView的使用
- 十进制586用格雷码表示是多少?
- CRC 的应用
- 双向流水灯的最简单程序
- 80x86汇编编程两题
- BCD 码的应用
- 彩虹文字--RainbowText
- C语言编程,对字符串进行处理