循环冗余检查 循环冗余码(CRC)及计算方法
关于CRC算法的详细解析
CRC,即循环冗余校验,是一种用于数据包或保存文件的校验与纠错算法。它利用除法和余数原理,通过计算获取校验数据,并重新组合成新的数据包。
在数据传输过程中,发送端会通过CRC算法计算数据的冗余部分,然后将这部分数据打包进新的数据包中发送出去。接收端在接收到数据包后,会运用同样的CRC算法对数据进行校验。只有当CRC校验的余数为0时,才证明传输的数据是正确的。
以下为CRC数据处理的一个示意图。在原始数据(K bit)后增加校验数据(R bit),便构成了新的数据包((K+R) bit)。而这个校验数据,实际上是原始数据经过除法运算后的余数。
发送端数据的CRC处理流程
发送端数据的CRC处理主要包括以下五个步骤:
1. 确定CRC对应的除数及多项式
基于模2除法,必须有一个二进制除数。这个二进制除数与一个特定的多项式存在对应关系。
例如,二进制除数为“1101”对应的多项式为G(x) = X^3 + X^2 + 1。
这个多项式通常是由发送端和接收端共同商定,标准的CRC算法多项式可参考下表。
2. 确定CRC校验数据的位数
校验数据实际上是除法运算后的余数,因此需要明确余数的位数。
多项式的最高次幂即对应了余数的位数。
如G(x) = X^3 + X^2 + 1的最高次幂为3,因此余数(即校验数据)的位数为3。
3. 移位并补充校验位
将原始数据左移R bit(R为校验数据的位数),并在低位补0。
例如,原始数据为“10011010”,若校验数据位数为3,则左移3位得到新的数据“10011010_000”。
4. 计算CRC校验数据
使用先前确定的除数,对移位后的数据进行模2除法运算(实际上是一种异或运算)。得到的余数即为CRC校验数据。
例如,对于上述的移位后数据“10011010_000”,通过模2除法运算得到的余数为“0101”,考虑到我们只需要3位的余数,因此实际校验数据为“101”。
5. 组成新的数据包
将计算出的CRC校验数据添加到原始数据的末尾,组成新的数据包。
如新数据包格式为:原始数据 + 校验数据(余数),即“10011010_101”。
接收端在接收到数据包后,将使用相同的多项式(如G(x) = X^3 + X^2 + 1)进行异或运算。如果余数为0,则说明数据传输无误。
CRC算法还具备对数据的纠错功能。关于其深入原理及更多内容,待后续学习后再与大家分享。