一:什么是CRC校验
CRC(Cyclic Redundancy Check)校验是一种常用的数据校验方法,用于检测数据在传输或存储过程中是否发生错误或被篡改。
CRC校验通过对数据进行一系列的位运算,生成一个校验值(CRC值)。发送方在发送数据之前计算CRC值,并将其附加到数据中。接收方在接收到数据后,同样计算CRC值。然后,接收方将计算得到的CRC值与接收到的CRC值进行比较。如果两个CRC值相等,说明数据在传输过程中没有发生错误。如果两个CRC值不相等,说明数据可能发生了错误或被篡改。
CRC校验使用多项式除法来计算CRC值。具体计算过程涉及将数据与预定义的多项式进行除法运算,并将余数作为CRC值。不同的CRC算法使用不同的多项式。
CRC校验具有高效、简单、可靠的特点,广泛应用于各种数据传输和存储中,例如网络通信、存储介质(如硬盘、光盘)的数据校验等。它可以有效地检测常见的传输错误,如位翻转、插入、删除和替换等。
关键点
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
二:CRC多项式
CRC多项式是CRC算法中的一个重要参数,它用于定义CRC的计算规则。CRC多项式是一个二进制多项式,通常表示为一个二进制数,其中每个位对应于一个多项式系数。CRC多项式的最高次数决定了CRC校验位的位数。
在CRC计算中,数据被视为一个二进制数,并与CRC多项式进行除法运算。除法的结果是一个余数,它就是CRC校验位。CRC多项式决定了除法运算的规则,它相当于一个特定的除数。
例如,CRC-8-ATM标准使用的CRC多项式是0x07,表示为二进制形式为0b00000111。这意味着在CRC-8-ATM的计算中,数据被除以0x07,并得到一个8位的余数作为CRC校验位。
不同的CRC标准使用不同的CRC多项式,选择适当的CRC多项式取决于具体的应用和需求。常见的CRC多项式包括0x07、0x1021、0x04C11DB7等,具体的数值取决于标准的定义。
三:运算逻辑
CRC运算的逻辑可以简单概括为以下步骤:
1. 选择一个预定义的生成多项式,通常称为CRC多项式。这个多项式决定了CRC校验的性能和特性。
2. 将待校验的数据按照位进行分割,并将每一位与CRC多项式进行异或运算。
3. 将异或运算的结果作为新的被校验数据,并将其与下一位进行异或运算。
4. 重复第3步,直到所有的数据位都被处理完。
5. 最后得到的异或运算结果就是CRC校验值。
在具体的实现中,CRC校验通常使用移位寄存器来进行计算。移位寄存器是一个存储二进制数据的寄存器,可以按位进行移位和异或运算。根据CRC多项式的位数,移位寄存器的长度也会相应调整。
在每一次异或运算后,移位寄存器会根据特定的规则进行移位操作,将新的数据位放入寄存器的最低位,并将最高位移出。这样就实现了对数据的逐位处理。
最后,移位寄存器中剩余的数据就是CRC校验值,可以与接收到的CRC校验值进行比较,以确定数据是否正确。
需要注意的是,CRC校验的具体实现可能会有一些变化,取决于所选用的CRC多项式和算法。不同的CRC标准(如CRC-8、CRC-16、CRC-32等)会采用不同的多项式和计算方式。因此,在实际应用中,需要根据具体的CRC标准来选择合适的CRC多项式和算法。
四:异或运算
抑或逻辑运算(XOR)是一种逻辑运算符,用于比较两个值的不同。在计算机编程中,抑或逻辑运算通常用符号“^”表示。它的工作原理是,如果两个值相同,则结果为0;如果两个值不同,则结果为1。
例如,假设有两个变量A和B,它们的值分别为1和0。使用抑或逻辑运算符对它们进行比较,结果如下:
A ^ B = 1 ^ 0 = 1
因为1和0是不同的,所以结果为1。
抑或逻辑运算在计算机编程中有广泛的应用,例如数据加密、校验和计算等。在CRC-8-SAE J1850校验算法中,也会使用抑或逻辑运算来计算校验值。
五:常用标准
CRC有许多不同的标准,每个标准都定义了不同的多项式和校验位长度。以下是一些常见的CRC标准:
1. CRC-8:使用8位多项式进行计算,生成8位的校验位。常见的CRC-8标准包括CRC-8-ATM、CRC-8-CCITT和CRC-8-MAXIM等。
2. CRC-16:使用16位多项式进行计算,生成16位的校验位。常见的CRC-16标准包括CRC-16-CCITT、CRC-16-IBM和CRC-16-USB等。
3. CRC-32:使用32位多项式进行计算,生成32位的校验位。常见的CRC-32标准包括CRC-32-IEEE和CRC-32-C等。
除了上述标准外,还有许多其他的CRC标准,每个标准都有不同的多项式和校验位长度,适用于不同的应用场景。选择适当的CRC标准取决于具体的需求和应用。
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/132406512
|