CRC校验为啥能够保证数据的准确性(出错率很低很低)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CRC校验为啥能够保证数据的准确性(出错率很低很低)相关的知识,希望对你有一定的参考价值。

网上很多只有算法,没有原理

你要搞清楚,CRC说到底只是校验码而已,能够以比较高的精度检测出一个二进制串中出现的错误(检测能力也不是100%的)。CRC校验并不能降低数据传输过程中的出错率……
其原理简单来说,就是将一个数字串A除以特定的除数B,把余数C加在数字串的末尾形成AC,那么这个数字串AC就应当能被B整除。如果不能整除则说明接收到的字符串AC是不正确的。
以十进制举个简单(但丝毫不严谨)的例子:我们要发送12345678这个数字串,除以11后余数是4,所以实际传输123456784这个数字串;接收端收到以后除以11能够整除,说明收到的数字串是没有问题的,于是可以放心地从里面把12345678这个数字串提取出来。
参考技术A 因为采用2进制存储数据(例如:1为0001,2为0010,3为0011,4为0100,5为0101,6为0110,7为0111),所以一定长度的数据里面存在多少个"1"可以在发送的同时可以得出,比如0101,他应该有2个"1"在这个里面,但是如果接收方收到的数据里面含有1个或者3个"1"在里面,就说明这个数据发送错误,我们一般采取重新发送数据的方法,校验大部分都是利用这样的原理,只不过实际应用更高级的时候会有更多的验证机制,有的还可以确定是哪位发生的错误直接就可以改正,采用的是取余数的方式,具体的话如果你需要了解可以查询相关资料 参考技术B CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+ r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC16,CRC32.
以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是 CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
K(X)>>16=G(x)Q(x)+R(x)
求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码
接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5 +1, CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1

参考资料:http://xmtrabbit.blog.163.com/blog/static/1613871320075240453210/

本回答被提问者采纳

CRC校验

CRC校验,是对一个数据帧发送到对方时,对方能够正确的接收到这个数据帧的一种保证,保证接收到的数据帧是对的。

CRC校验,一般占16位,两个字节。我们在发送一个数据帧的时候,对CRC校验前面那些位,用一种特殊的算法进行统计,算出来的数作为CRC校验这两个字节,填充到CRC这两个字节中。然后将数据帧发送出去。对方接收到这个数据帧的时候,将数据帧中的代表CRC校验的两个字节取出来,存下,然后自己对接收到的数据帧CRC校验前面的那些位进行和上面一样的算法进行统计,算出来的CRC校验和数据帧过来时带过来的CRC进行校验比对是否一样,如果一样那么这一帧数据就可以用,如果不一样,说明这帧数据是不对的,就丢弃掉不做处理。

本文出自 “whylinux” 博客,谢绝转载!

以上是关于CRC校验为啥能够保证数据的准确性(出错率很低很低)的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议100%可靠吗?

为啥我的 cross_val_score() 准确度很高,但我的测试准确度却很低?

CRC校验

CRC校验

CRC校验8

为啥将视频转为GIF后,文件反而比视频大的多了?