循环冗余校验码原理(CRC码)

循环冗余校验码(Cyclic Redundancy Check, CRC)的基本思想是发送方和接收方约定一个除数,被除数是由信息位(n)和校验位(k)组成,最终除法的余数要等于 0

原理

假设数据为 10101011,生成多项式为 10011,求 CRC 码?

多项式就是双方约定的除数 10011

  • 最高位次幂为 4
  • CRC 码位数由信息位和校验位组成:8 + 4 = 12

由于 CRC 码是 12 位,目前数据为 10101011 只有 8 位,需要左移 4 位(低位补 0),得到 101010110000

对移位后的数据进行模2除,产生余数:

  • 被除数最高位为 11,为 00
  • 剩余位数进行异或运算
  • 最终余数的位数应该比除数的位数少一位

模2除用竖式计算,算出最后的余数为 1010

  • 101010110000/10011

    • 10101/10011 = 1 ... 0110
    • 01100/10011 = 0 ... 1100
    • 11001/10011 = 1 ... 1010
    • 10101/10011 = 1 ... 0110
    • 01100/10011 = 0 ... 1100
    • 11000/10011 = 1 ... 1011
    • 10110/10011 = 1 ... 0101
    • 01010/10011 = 0 ... 1010

余数 1010 就是 CRC 码的校验位,加上信息位组合成最终的 CRC 码: 101010111010

10101011101010011 相除,最终的余数一定是 0000

检错和纠错

发送的 CRC 码记为:C12C11C10C9C8C7C6C5C4C3C2C1

C12C11C10C9C8C7C6C5C4C3C2C1
101010111010

一位出错(纠错)

C12C11C10C9C8C7C6C5C4C3C2C1
101010111010
C4出错101010110010

101010110010代入模2除,得到余数 0100,对应十进制 4,也就是说 C4 处出错了

一位出错(不能纠错)

上面的例子,校验位是 4 位,可以表示 16 种状态,实际的 CRC 码只有 12 位,所以有纠错能力。

如果校验位是 3 位,可以表示 8 种状态,实际的 CRC 码有 9 位,这种情况下就没办法实现纠错了。

假如说现在求得的余数是 010 转换为十进制是 2,能否说明第 2 位出错了呢?

看下面表,010 对应的出错位是 29,也就是说当第二位或者第九位出错了,余数是一样的,这就导致了我们根据 010 没判断出错位了。

接受余数出错位
101001001000
1010010000011
1010010110102
1010011010113
1010000011004
1010110011015
1011010011106
1000010011117
1110010010018
0010010010109

所以要使 CRC 码有纠错能力,必须满足:2^k >= n + k + 1

  • n + k 表示错误的状态的数量
  • 1 表示的正确的状态

不过在实际的应用,CRC 码只用于检错,比如几千个bit+几个校验位

总结

  1. 确定 CRC 码位数
  2. 移位,低位补 0
  3. 模2除求余数,余数是校验位
  4. CRC码 = 信息位 + 校验位

如果要有纠错能力,需要满足:2^k >= n + k + 1


前端学习笔记
一步一个脚印

一只刚刚接触前端的小鸟

594 声望
73 粉丝
0 条评论
推荐阅读
《图解 Google V8》事件循环和垃圾回收——学习笔记(三)
这是《图解 Google V8》第三篇/共三篇:事件循环和垃圾回收这里主要讲了 2 点:事件循环:宏任务和微任务什么是微任务微任务的执行时机垃圾回收垃圾回收运行过程垃圾回收算法通过这个专栏的学习,V8 不在是个陌生...

uccs阅读 259

封面图
补计算机基础
数据存储的最小单位。在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。计算机中的CPU位数指的是CPU一次能处理的最大位数二进制数系统中,位简记为b,也称为比特,每个二进制数字0...

Macrohoo1阅读 583

再快一点?动态内容如何加速
近年来 Web 3 的概念在程序员的小圈子也几乎是人尽皆知了。功能再强,噱头再足,但是如果访问速度没有跟上,一起都是浮云。哪怕拿现在已经成熟的 Web 2.0来说,内容也相当丰富,动态网页、个性化内容、电子交易数...

菜农曰阅读 940

封面图
TCP协议是如何保证数据的可靠传输的
一个数据包,从聊天框里发出,消息会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer),数据包在传输层添加一个TCP头部、在网络层添加一个IP首部,进入到数据链路层添加一个首部和尾部,将其...

爆裂Gopher阅读 402

封面图
三体中的人列计算机到底是啥?
大家好,我是鹤涵。大家最近看三体电视剧版本了吗?跟原著还原度非常高,甚至超过原著(画面震撼呀)!其中第15集,居然出现了冯.诺依曼+秦始皇的组合,用3000w名士兵组成了一台人形计算机。作为程序员我可不困了,...

程序员鹤涵阅读 379

封面图
GBK & UTF-8
GBK是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB...

老污的猫阅读 86

一只刚刚接触前端的小鸟

594 声望
73 粉丝
宣传栏