目录
CRC(循环冗余校验)
CRC 校验码的生成
CRC 的发送方与接收方
发送方
接收方
除法异或运算示意图
CRC(循环冗余校验)
CRC(Cyclic Redundancy Check)循环冗余检验,是一种用于检测数字数据错误的技术。作为一种校验和类型,CRC 根据文件或更大数据集的构建生成固定长度的数据集。就其用途而言,CRC是一种哈希函数,用于检测数字电信网络和硬盘驱动器等存储设备中常用的原始计算机数据的意外更改。
在循环冗余校验中,固定数量的校验位被附加到需要传输的消息中。数据接收器接收数据,并检查检查位是否有任何错误。在数学上,数据接收器通过查找所传输内容的多项式除法的其余部分来评估附加的检查值。如果似乎发生了错误,则会发送否定确认,要求重新传输数据。
循环冗余检查也适用于硬盘等存储设备。在这种情况下,检查位将分配给硬盘中的每个块。当计算机读取损坏或不完整的文件时,将触发循环冗余错误。CRC 可以来自其他存储设备或 CD/DVD。错误的常见原因包括系统崩溃,文件不完整或损坏,或者有很多错误的文件。
CRC多项式设计取决于应该受到保护的块的长度。错误保护功能也可以决定CRC设计。可用于CRC实施的资源可能会对性能产生影响。理解CRC的另一种方法是查看其名称中的特定单词。专家指出,CRC被称为“冗余”,因为它增加了数据集的大小而没有添加新信息,而“周期性”则因为它适用于周期性实施系统。
如前所述,指出CRC是一种特定类型的校验和也是有帮助的,其中任意大小的数据集映射到固定大小的字符串,可以将其称为哈希函数。相比之下,校验和本身可能非常简单 , 例如,基元校验和可以只是相关字节值的总和。使用其周期性设置的CRC通常被认为是检查错误和验证数据完整性的一个非常好的策略。它是校验和使用和散列以及一般文件检查中不断发展的工具包的一部分。
CRC 校验码的生成
CRC校验码的生成主要包含以下过程:
- 找到除数的长度,这个除数是我们自己定义的。
- 除数的位数减一为CRC校验码的位数,假设除数的位数为5,则校验码的位数为4,对被除数也就是需要传递的信息的数后面加上校验码的位数的0,如果校验码的位数为4,则在被除数后面直接加上4个0
- 执行除法操作,将加上4个0的被除数作为新的被除数,除以我们定义的除数,除法操作完成后,会得到两个结果:一个是商,另一个是余数。(注意:除法运算采用异或运算)
- 得到的余数即使我们要的 CRC 校验码
CRC 的发送方与接收方
发送方
发送方给出需要传递的数据(Data),并定义多项式(polynomial),以多项式得到(n+1)位除数(divisor),对数据的末尾补上n位0,作为被除数,用除数去除被除数,得到的余数就是所需要计算的n位CRC校验码,将得到的CRC校验码拼接到原始数据的末端生成新的数据,将这个数据一并传给接收方。
接收方
接收方需要做的事就更简单一些,将得到的一整块数据作为被除数,用在发送方得到的除数去除被除数,如果结果余数为0的话,代表数据的传输没有出错,得到的数据事正确且有效的。
接收方还有另外一种方法,即使发送方分别发送数据和CRC数据,结束方得到数据末尾补n个0作为被除数,用多项式除数去除被除数,得到的余数如果作为接收方的CRC校验码,如何接收方得到的CRC数据和发送方发的CRC一致的话,同样也可以证明数据的传输是没有问题的。
除法异或运算示意图
可以看到图中,我们所要传递的信息为100100,也就是被除数,我们自定义的除数为1101,它的位数为4,因此要在被除数后面加上3个0,然后进行除法异或运算,最终得到的商为111101,得到的余数为001,根据前面的定义,这个余数001就是我们想要的 CRC 校验码。
然后将生成的 CRC 校验码添加到原被除数的后面,也即是100100后面补上001得100100001,这就是我们要发送的新的数据信息包含了 CRC 校验码,接收端就可以进行相应的解析。
更具体的CRC校验码的计算方法可以参考一位B站up主的教学视频
[CRC校验]手算与直观演示
将自定义的多项式以电路的形式展现,原始数据加上相应位数的0,依次进入到电路当中,最终生成的就是我们所需的CRC校验码。更详细的计算方法可以在视频中学习。