简介
CRC(Cyclic Redundancy Check)即循环冗余校验是一种既能检错也能纠错的校验码,校验的原理是基于模2运算;
编码/解码过程
这里以一个示例来进行说明编码过程,假设原始数据为:110
1、计算校验位的位数
根据公式 k + r ≤ 2r - 1 计算,其中【r】为校验位位数,【k】为原始数据的位数。
原始数据是:110
,也就是k = 3
,根据公式算出r <= 2
2、选择多项式
选择一个r+1
位的多项式,也就是最高次幂等于r
的,上面算的r <= 2
,先从r=2
开始,在下面的常用多项式中没有最高次幂等于2的,那么就让r=3
,再看下面有符合的多项式:$ x^3+x+1 $,转换成二进制: 1011
3、计算
- 原始数据
110
左移r
位,变成110000
- 用
110000
除以1011
,得到余数是个1 - 将余数
1
放在110
的右侧的r
位的校验位上,也就是变成110001
最终校验码就是:110001
4、校验
将收到的【校验码】除以多项式1011
,如果余数为0,表示无错,反之,则表示有错
5、出错举例
例子1:如果收到校验码是110101
,除以多项式1011
,得到的余数是个100
,换算成10进制等于4
例子2:如果收到校验码是111001
,除以多项式1011
,得到的余数是个11
,换算成10进制等于3
通过上面两个例子可以看出,余数和出错的位数不相等,不像海明码那样最后出错的结果正好等于出错的位数,虽然CRC出错计算的余数不等于出错的位数,但是余数和出错的位数之间还是有固定的映射关系,不同的多项式,映射关系不同,Logisim-017-CRC解码,这边文章里面有一个100101
多项式的映射关系,可以看看;