CRC循环冗余校验码计算过程

129 阅读1分钟

CRC只能检错,不能纠错。

本文盲区

生成式多项式 G(x)G(x) 的来源

但是,许多生成多项式已经被标准化,成为行业通用的选择。在实际应用中,通常直接使用这些标准化的生成多项式,以确保兼容性和可靠性。


纠错原理

发送数据后,使用相同的多项生成式 G(x)G(x),进行模2除法运算,得到结果 0 ,则表示本次数据无误。

  1. 补位

T(x)T(x)向左位移 G(x)G(x)的最高次 nn,即在 T(x)T(x)结尾补 nn 个 0,得到 T(x)xnT(x) * x^n,目的是为了加上校验码R(x)R(x) 用于校验数据的完整性。

  1. 发送

有数据项 T(x)T(x) 需要发送,选择多项生成式 G(x)G(x),通过 T(x)xnT(x) * x^nG(x)G(x)进行模2运算,得到商为 Q(x)Q(x),余数为R(x)R(x),则T(x)xnT(x) * x^n可表示:

T(x)xn=Q(x)G(x)+R(x)(式子1)T(x) \cdot x^n = Q(x) \cdot G(x) + R(x) \quad \text{(式子1)}

等式两边同时加上R(x)R(x),得:

T(x)xn+R(x)=Q(x)G(x)(式子2)T(x) \cdot x^n + R(x) = Q(x) \cdot G(x) \quad \text{(式子2)}

因为模2运算,R(x)+R(x)=0R(x) + R(x) = 0,而等式左边相当于是直接将余数替换掉0的操作。因为例如000+101=101 000 + 101 = 101

所以,最终:

T(x)xn+R(x)T(x)* x^n + R(x)

作为本次的发送数据。

  1. 校验

接收方,拿相同的多项生成式 G(x)G(x),用 T(x)xn+R(x)T(x)* x^n + R(x)G(x)G(x)进行模2运算,由于式子2,可得:如果发送数据没有出错的情况下,本次模2运算将是一个整除操作,不会有余数的产生,所以校验时观察余数结果是否是0,即可校验数据的正确性。