CRC里的除法不是简单的二进制除法,CRC里的除法运算规则如下所示:
1111_000 被除数
1101 除数
----------------------
够除数的位数,商等于1
0010 (余数,通过除数与被除数前4位求异或得到)
------
100 (把被除数第5位挪下来)
1101 除数
------
位宽不够,商等于0
1000 把被除数第6位挪下来
1101 除数
------
够除数的位数,商等于1
0101 余数(仍然是通过异或操作得到)
------
1010 把被除数第7位挪下来
1101 除数
------
够除数的位数,商等于1
0111 余数(仍然通过求异或得到)
------
被除数共7位,除完
所以得到商1011,余数111.
再举个例子:已知信息位1100,生成多项式G(x)= x3 + x + 1,求CRC码
M(x)= 1100
M(x)* x3 = 1100000
G(x)= 1011
M(x)* x3 / G(x)= 1110 + 010/1011
R(x)= 010
CRC码为:M(x)* x3 + R(x)= 1100000 + 010 = 1100010
其原理是:CRC码一般在k位信息位之后拼接r位校验码位生成。编码步骤如下
- 将待编码的k位信息表示成多项式M(x);
- 将M(x)左移r位,得到M(x)*2r;
- 用r+1位的生成多项式去除M(x)*xr得到余数R(x);
- 将M(x)*xr与R(x)作模2加(不是很明白),得到CRC码