一、CRC码
CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。
二、XOR
XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。
三、用XOR代替算术运算上除法的两个例子。
1、10110010000/11001
第一次异或(相除),得到商为1,余数为1111,加入下一位0,进行
第二次异或,得到商为1,余数为111,加入下一位1,余数为1111,四位与除数5位不能够异或计算,所以此处商为0,加入下一位0,进行
第三次异或,得到商为1,余数为111,同理第5位商为0,余数继续加入被除数的下一位0,进行
第四次异或,得到商为1,余数为101,加入后一位被除数的0,得到商为0,最终余数为1010,而最终商为1101010。计算流程如下图所示:
如若让被除数10110010000加上余数1010则为10110011010,再除以(异或)11001,则得到余数为0000(此处不再具体计算).
2、1111000/1001
经过三次异或(相除)得到商为1110,余数为110,具体例程如下,
同样,让该例的被除数1111000加上余数110后为1111110除以(异或)除数100则得到余数为000.
四、CRC校验原理
由以上两个例子可以看出,通信过程中加入想要传送的数据是“被除数”,加上余数后再传送。而接收一方接收完整数据后,除以除数,如果余数为0,则说明传送的数据正确,如果不为0则说明传送的数据有误。因为对于一个确定的“除数”,则就会有唯一的余数与之对应。这个过程其实就是一个CRC的校验过程。不过名称改一下不能叫做被除数除数什么的。可以规定上述的除数叫做生成多项式或生成项,用g(x)表示。而余数就叫做CRC校验码。由以上知道,对于不同的生成项,则就会有唯一的CRC校验码与之对应。而对于要传送的数据也可以用一个系数仅为0和1取值的多项式一一对应。例如代码1010111对应的多项式为x^6+x^4+x^2+x+1.而多项式x^5+x^3+x^2+x+1对应的代码是101111.
实际上,上述的被除数并不是真正的要传送的数据,真正要传送的数据是一个多项式左移CRC校验码位数后的代码。定义CRC校验码的位数表示它本身的宽度。
另外,关于生成项,不难发现其最高位是1,实际上在除法的每次XOR时候都要被消掉,所以一般第一个1不做参考,后面的几位才是最重要的。这就是为什么生成项的位数比CRC宽度大1的原因。且生成项的最后一位也必须同时为1.一般生成项简写时候不写最高位的1.以下是各种常用的生成项表达式:
CRC-4:x^4+x+1;-------------------------------->0x03
CRC-8:x^8+x^5+x^4+1;--------------------------->0x31
CRC-8:x^8+x^2+x^1+1;--------------------------->0x07
CRC-8:x^8+x^6+x^4+x^3+x^2+x;------------------->0x5E
CRC-12:x^12+x^11+x^4+x^3+x+1;------------------>0x80
CRC-16:x^16+x^15+x^2+1;------------------------>0x80005
CRC-16:x^16+x^12+x^5+1;------------------------>0x1021
CRC-32:x^32+x^26+x^23+....+x^2+x+1;------------>0x04C11DB7
CRC-32:x^32+x^28+x^27+....+x^8+x^6+1;---------->0x1EDC6F41
五、C语言的实现
附录: