由于一些任务要求需要了解CRC校验,于是来学习一下。
新人学习,大佬绕路。
前言
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC 的步骤大致如下:
- 选择多项式:选择一个预定义的多项式作为生成器。不同的应用和标准会使用不同的多项式。
- 初始化寄存器:设置 CRC 计算的初始值,通常是全 1 或全 0。
- 逐位处理数据:将数据分成多个位进行处理,计算时使用生成多项式。
- 计算结果:最终得到的结果就是 CRC 校验码。
CRC 具有很强的错误检测能力,能检测到常见的错误类型,如单比特错误、双比特错误、突发错误等。常见的 CRC 标准包括 CRC-16、CRC-32 等。
1、多项式表示
使用多项式来进行 CRC 计算的原因在于它能够很好地表示和处理二进制数据,同时提供了强大的数学工具来检测错误。多项式对应二进制的方式很直观,每一位二进制数都对应多项式的一个系数。
1.1 多项式与二进制的对应关系
多项式的每一个系数对应二进制数的每一位。
例如:
多项式 x3+x+1对应二进制 1011
x3对应二进制的最高位 1
x2 对应二进制的次高位 0(因为没有 x2项)
x1 对应二进制的次低位 1
x0 对应二进制的最低位 1
2.数据扩展
我们需要在数据后面附加与多项式阶数相同数量的零。因为多项式是三阶(最高次项是 x3),我们在数据后面加 3 个零:
1101 -> 1101 000
3.开始二进制除法
3.1 二进制除法与异或的关系
二进制除法在 CRC 计算中的实现本质上是通过异或运算来完成的,也有的地方叫做模2除法。
异或运算
异或运算的规则是:
如果两个位相同,则结果为0。
如果两个位不同,则结果为1。
3.2 具体步骤
在 CRC 计算中,二进制除法的步骤可以用异或运算来模拟。具体来说,当我们使用一个多项式(如 x3+x+1)去除一个二进制数据时,实际上我们是在执行一个逐位的异或运算。
3.2.1初始数据准备
原数据:1101
多项式:1011
新数据(在数据后面附加三个零):1101000
3.2.2 逐步计算过程
其他数据更复杂的计算举例
校验码为0b0001.
3.2.3校验码
0b0001
3.2.4信息码
0b1101001
3.2.5 详细总结:
- 数据扩展:在数据后面加上与多项式阶数相同数量的零。
- 对齐与异或:将数据的前几位与多项式对齐,进行异或运算,得到新结果。
- 重复步骤:将新的结果继续与多项式对齐,进行异或,直到数据处理完毕。
- 得到校验码:剩下的部分就是 CRC 校验码,位数与扩展保持一致。
- 得到信息码:将校验码添加到初始数据后可得到信息码。
这种方法通过二进制除法来检测数据传输或存储中的错误,可以检测到常见的错误类型。实际应用中使用的多项式和数据长度会更复杂,但基本过程是一样的。
4.数据验证
用收到的信息码与除数做异或,余数为0,则说明收到的数据正确。
5.参数模型
CRC算法参数模型解释:
- NAME:参数模型名称。
- WIDTH:宽度,即CRC比特数。
- POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
- INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
- REFIN:待测数据的每个字节是否按位反转,True或False。
- REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
- XOROUT:计算结果与此参数异或后得到最终的CRC值。
参考链接
CRC参考链接1
CRC参考链接2
CRC参考链家3
CRC参考链接4
CRC参考链接5