循环冗余校验码
基本思路
数据发送方、接收方约定一个二进制 除数
信息位k + 校验位r作为 被除数
添加校验位后需保证除法的余数为0
接收方接收数据后,进行除法检查余数是否为0,若余数非0则进行重传或纠错
实现步骤
例:设生成多项式G(x)=X^3 + X^2 + 1,信息码为101001,求对应的CRC码
确定k、r以及生成多项式对应的二进制码
k = 信息码长度 = 6
r = 生成多项式最高次幂 = 3
n = 校验码位数 = k + r = 6 + 3 = 9
生成多项式G(x) = (1) * x^3 + (1) * x^2 + (0) * x^1 + (1) * x^0 = 1101
移位:信息码左移r位,低位补0
移位后的结果 = [信息位][r位] = [101001][000] = 101001000
相除:对移位后的信息码,用生成多项式进行模2除法,产生余数即为校验位
![](https://img-blog.csdnimg.cn/img_convert/c5599b2956e69669613377cdc71a62d2.jpeg)
CRC码 = 信息码 + 校验位 = [101001][001] = 101001001
检错和纠错
发送:101001001,记为C9C8C7C6C5C4C3C2C1
接收:101001001,用1101进行模2除运算,余数为000,代表未出错
接收:101001011,用1101进行模2除运算,余数为010,代表第2位(C2)出错(不严谨)
由于3个bit校验位(001)仅能表示2^3=8种状态,所以8以下的信息位有纠错能力,即2^r >= k + r - 1,则CRC码可纠错1位
理论上循环冗余校验码检错能力有以下特点
可检测出所有奇数个错误
可检测出所有双比特的错误
可检测出所有小于等于校验位长度的连续错误
循环冗余校验码通常用于计算机网络中数据传输,几千bit位信息码 + 几个位校验码,实际应用中只用于检错