CRC也就是循环冗余校验码,是计算机网络通信领域常用的校验码。循环冗余校验码包括一系列移位、相除等数据编码规则,其算法原理、算法程序的设计与分析,都可以通过相应的软件编码进行解决。
循环冗余校验码是利用软件进行校验的算法,因此其检验速度很快,校验的误码率也较低,整个计算机网络通信的信息传输速度很高。CRC差错纠正控制法能够有效减少通信线路的误码率,得到的通信数据传输信息更准确。
在数据的传输过程中由于空间电磁环境复杂等原因,可能会产生误码,即某几位数据0变为1,或1变为0,导致接收端得到错误的数据。为了降低误码率,通常对数据进行特定编码,在收发端进行额外的验证,使接收端能发现某些错误;
进而实现纠错功能,常用的编码方法有CRC-校验码、CRC-校验码、汉明码、奇偶校验法等。其中位循环冗余校验简称CRC-校验在性能和资源消耗两方面都有较大的优势,因而,在无线电通信、SATA硬盘数据传输等系统中,CRC-校验是最常用的检错手段之一。
CRC叫做循环冗余校验,是检验发送数据是否正确的一种方法。比如你发过来的是0x这个数据,要是发送过程中出现了干扰,变成了其他数据比如0x,这样送到设备上会出问题的。所以MODBUS利用了一种方法,就是把每一个BYTE的数据和一个固定值(位数值)进行一次运算(循环的,比如上面的数据中运算完结果用在上运算,再往下以此类推),最后得到一个2BYTE的数值(位)。也就是经过这一系列的运算,发送方和接收方算出来的CRC数值应该相同的;如果传送中数据的某一位或者某几位出现了问题,那么运算出来的结果就会不一样(并不是%,但是已经很高了),那么这个数据就不能要了。懂了吗?
检测数据传输保存后出现的错误。循环冗余检查是一种根据数据产生简短固定位数校验码的散列函数,主要用于检测或校验数据传输或者保存后出现的错误,生成的数字在传输或者存储之前计算出来并附加到数据后面,然后接收方进行检验确定数据是否发生变化,循环冗余校验的值都是位的整数,由于该函数易于用二进制的计算机硬件使用,容易进行数学分析,并尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。
循环冗余码CRC(Cyclic Redundancy Code)又称多项式码.
任何一个由二进制数位串组成的代码,都可以惟一地与一个只含有0和1两个系数的多项式建立一一对应的关系.例如,代码对应的多项式为X6+X4+X2+X+1,多项式X5+X3+X2+X+1对应的代码为.
CRC码在发送端编码和接收端检验时,都可以利用事先约定的生成多项式G(X)来得到.设G(X)中最高位X的次方为Xr,信息位为K(X);则CRC码=Xr乘以K(X)再除以G(X).
比如:信息位K(X)=X6+X4+X3+1既,生成多项式G(X)=既X4+X3+1(可得Xr=X4)
则CRC码=X4* (X6+X4+X3+1)/(X4+X3+1)=X+X8+X7+X4/(X4+X3+1)=/
得到的余数就是CRC码
注:以上除法用的是模2除法,是一种不考虑减法借位的运算.既0-0=0,0-1=1,1-0=1,1-1=0
—————————————————————————————
重新在网站做了图解,有疑问的话直接在网站留言吧
CRC循环校验是什么
CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。(哇,真拗口,希望大家不要当我是唐僧,呵呵。^_^)
CRC有什么用呢?它的应用范围很广泛,最常见的就是在网络传输中进行信息的校对。其实我们大可以把它应用到软件保护中去,因为它的计算是非常非常非常严格的。严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。Hoho,是不是很厉害呢?所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被Cracker用进制工具暴力破解过了。
参考资料:矛与盾的较量(2)——CRC原理篇%%老罗的缤纷天地.htm