CRC常用于判断文件在传输过程中文件内容是否被更改以及其他的一些加密算法,在Java中,CRC32 工具类提供给我们使用。
1.CRC校验具体原理如下:
在要发送的数据帧后面附加一个数(这个就是用来校验的验证码,都为二进制序列),生成一个新帧发送给接受端。当然这个附加的数不能是随意的,它要使所生成的新帧与
发送端和接收端共同选定某个数整除(注意:这里不是使用的二进制除法,而是一种称为:模2除法)。生成的新帧到达接收端后,再用这个新帧除以(同上)这个选定的数。
因为在发送之前就已经附加了一个数,做了”去余“处理。也就能够整除了。所以结果应该没有余数。如果有余数则表示在传输过程中出了差错。
说明:
”模2除法“ 与算术除法类似,但它既不向上借位,也不比较除数与被除数的相同位数值大小,只要以相同位数进行相除就可以了。模2加法运算为:1+1=0;1+0=1;0+1=1;0+0=0
2.模2减法运算为:1-1=0;1-0=1;0-1=1;0-0=0。相当于二进制中逻辑异或运算(相同为1,不同为0)。如100101除以1110,结果得到商为11,余数为1.如11*11=101
3.CRC具体执行步骤:
1.先选择一个用于在接收端进行校验时,对接收的帧进行除法运算的除数
2.看所选择的除数二进制数(假设k位),然后在要发送的数据帧(假设m位)后面加上k-1位”0“,然后以这个加了k-1个"0"的新帧(一共是m+k-1位)以”模2除法“方式除以上面这个除数,所得到的余数(也就是二进制字符串)就是该帧的CRC校验码,也称为:FCS(帧校验序列)。但一定要注意:余数的位数一定要是比除数位数只能少一位,哪怕前面一位是0,甚至全为0,也都不能省略。
3.再把这个校验码附在原数据帧(也就是m位的帧,注意不是在后面形成的m+k-1为的帧)后面,构建一个新帧发送给接收端。最后把这个接收端以”模2除法“方式除以前面选择的除数,如果没有了余数,则表明该帧在传输过程中没有出现差错。
4.总结
从上面可以看出:CRC有2个关键的点。一是要选择一个发送端和接收端都用来作为除数的二进制比特串(或多项式)。二是用原始帧与上面选择的进行二进制除法运算,计算出FCS。前者可以随机选择,也可以按照国际通用标准进行选择,但最高为与最低为都必须为1,CRC16=X^16+X^15+X^2+X(对应二进制:11000000000000101)
5.案例
选择CRC生成多项式G(X)=X^4+X^3+1,要求求出二进制序列10110011的CRC校验码。
参考:https://wenku.baidu.com/view/34ba49149b89680202d82513.htmlram=1