与海明校验码类似,CRC码也是数据通讯中常用的校验方式。
CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。
结构
与海明校验码数据位和校验位穿插不同,CRC码中,校验位(R位)在信息位(K位)后面
计算校验位
以一个题目为例:设待校验的数据为。D8~D1 = 10101011,若采用CRC,且生成多项式为 10011,则其 CRC 码为:
这里首先要注意题目中的一个表述——“多项式”,该题目中写作“10011”,在有的题目中往往写作“x^4+x+1”
首先,在数据位后加多项式最高幂次个0,比如这里的多项式最高次项为x^4,那就在数据位后加四个0,变成:101010110000,作为被除数
然后,将多项式 10011 作为除数进行断除。需要注意的是,图中所框的部分,对应位只做xor运算,也就是做减法但不影响其他位
最后得到的余数:1010,即是校验位。那么整个CRC码为:10101011 1010
接收端校验
以上一节例题为例,假设收到的CRC码变成了10001011 1010,第10位(右边为低位)发生了错误。
现在尝试用CRC码与多项式 10011 进行短除:
得到余数为 1010(2) = 18+12 = 10(10) ,即第10位发生错误,只需要反转第10位的值,便可获得正确的值