循环冗余校验码的思想:
例题:
注:
1.生成多项式即为约定的除数。
2.产生的余数为R位(比除数少一位)二进制数。
3.模二除法后得到的余数替换校验位,即得到对应的CRC码。
(CRC码除以约定的除数后等于0表示此次传输数据没有发生错误,反之则表示其中可能某些比特传输错误)
注:
1.这里与海明码不同,余数转换成十进制后的数与出错位没有必然的联系,例如,余数100转换成十进制后为4,但是出错位并不是4,而是3。
2.如果约定的除数不变,余数与出错位固定不变。
如图所示,给出了例题中出错位对应的余数:
例题中的余数有3位,说明可以表示8种状态,其中000代表传输正确,剩下001 ~ 111会分别表示1 ~ 7位出错,但是传输过去的CRC码一共有9位,剩下的2位会根据1 ~ 7位的出错余数循环表示。
所以说如果余数为010不一定会代表第2位出错,也有可能是第9位。
因为余数没有与出错位一一对应,这样子的CRC码好像只有检错能力,并没有起到纠错的功能,那是因为信息位太多。
如:
因为这个弊端,通常CRC码在实际应用中只用来检错。
————————————————————————————————————————————————
《模二运算》
1、模二加的运算法则:
0+0=0, 0 + 1 = 1, 1+ 0 = 1, 1+ 1 = 0
理解:两个二进制数相加相减不考虑进位
例:
01 + 11 = 10,
对于两个数的低位都是1,进行模二和为0,但是没有进位,所以高位的0 加1 还是1,因为不考虑低位的进位。
2、模二减的运算法则:
0 - 0 = 0, 0 - 1 = 1, 1 - 0 = 1, 1 - 1 = 0
例:
1 0 1 0 - 0 1 1 0 = 1 1 0 0
上式的减法中,第三位的减法中0 - 1,如果按照二进制的减法是有借位的,但是对于模二减是没有借位的,所以才会有第四位中的1 - 0仍然为1。
综上:模二加、模二减的结果与异或运算相同。
3.模二除的运算法则:
以例题为例:
1.被除数首位为1时商1,为0时商0。
2.商乘以除数与被除数进行模二减法(异或运算)。
3.去除首位,其余位数进行异或运算,被除数再补位,得到的余数作为新的被除数。
4.往后重复这些步骤直到被除数没有位可以补下来为止。
4.模二乘运算法则:
0 * 0 = 0, 0 * 1 = 0, 1 * 0 = 0, 1 * 1 = 1
模二乘法的运算的乘法部分与普通多位二进制数运算相似,但是加法部分用的则是模二加运算。
————————————————————————————————————————————————