CRC算法¶
重要
详细参见论文``A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS``
CRC 校验是通信领域中的一种差错校验码。数据通常与 CRC 验证工具进行比较。CRC 校验工具一般分为 CRC16 和 CRC32 两种,因此有两种 CRC 校验计算器。
CRC 检验原理实际上就是在一个 p 位二进制数据序列之后附加一个 r 位二进制检验码 (序列),从而构成一个总长为 n=p+r 位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。
CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。
几个基本概念¶
帧检验序列 FCS(Frame Check Sequence):为了进行差错检验而添加的冗余码。
多项式模 2 运行:实际上是按位异或 (Exclusive OR) 运算,即相同为 0,相异为 1,也就是不考虑进位、借位的二进制加减运算。如:10011011 + 11001010 = 01010001。
生成多项式(generator polynomial):当进行 CRC 检验时,发送方与接收方需要事先约定一个除数,即生成多项式,一般记作 G(x)。生成多项式的最高位与最低位必须是 1。
说明¶
CRC 是一种常用的检错码,并不能用于自动纠错。
只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。
仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(只是非常近似的认为是无差错的),并不能保证可靠传输。
参考¶
循环冗余校验(CRC)算法入门引导: https://blog.csdn.net/liyuanbhu/article/details/7882789