前提:
1.已知待发送数据str
如str="1111"
2.双方约定好辅助多项式g(x)
如约定g(x)=“10011”,用函数表示为g(x)=
发送方:
1.向待发送数据str末尾添0,0的个数为g(x)的最高次数,生成str0
这里g(x)最高次数为4,即新的str0=str+4个0="11110000"
2.用str0除以g(x),得到的余数即为CRC校验位
注意!这里除法是二进制模二除法,且余数位必须等于添0的个数,否则在余数前面补0
这里str0="11110000"模二除以g(x)="10011",得余数CRC=“0010”(模二除法见文章末尾)
3.用原str拼接CRC,即为生成的带校验数据
即发送方应发送str+CRC="1111"+"0010"="11110010"
接收方:
将接收到的数据使用模二除法,除以辅助多项式g(x)
若能整除,则代表数据正确
若不能整除,则代表数据错误,且余数的值即为出错的位数(位数从右到左,从1开始计数)
接收方收到了“11010010”,模二除以g(x)"10011"
得余数为110,即十进制6,即第六位出错,变成了0,可纠正回为1
补充------二进制模二除法
与普通除法规则不同在:
1.上商:部分被除数与除数,位数相同即商一,部分被除数位数小于除数才商0
2.减法:部分被除数与除数相减改为相异或
如图: