你如何计算CRC中使用的XOR余数?

时间:2008-12-05 20:06:05

标签: xor crc polynomial-math

我正在努力记住如何计算数学以计算循环冗余校验中的XOR算法的剩余部分,以验证网络消息的其余位。

我不应该扔那本教科书。

这很容易在代码中完成,但它是如何手工解决的?

我知道它看起来像一个标准的分割算法,但我不记得从那里去哪里得到余数。

      ___________
1010 | 101101000

注意:我确实谷歌了,但无法找到他们在计算剩余部分时的步骤。

3 个答案:

答案 0 :(得分:4)

1010 | 101101000
       1010
       0001 this result is 1011 XOR 1010 = 0001
          1010
          1010
          0000  thus no remainder. 

因此101101000是完美的,并且在发送/接收中没有发生错误

答案 1 :(得分:2)

根据我的经验,在手动计算时将其转换为多项式更容易,特别是在有很多零时。

1010 = 1*x^3 + 0*x^2 + 1*x^1 + 0*x^0 = x^3 + x = x3 + x
101101000 = x8 + x6 + x5 + x3

       -------------------
x3 + x ) x8 + x6 + x5 + x3

然后你将红利(x^8)中的最大词 除以 第一个词 在除数x^3)中,产生x^5。您将该数字置于顶部,然后 乘以 它与除数中的每个术语。这为第一次迭代产生以下结果:

        x5
       -------------------
x3 + x ) x8 + x6 + x5 + x3
         x8 + x6

为每个术语执行XOR,然后产生新的红利:x5 + x3

        x5
       -------------------
x3 + x ) x8 + x6 + x5 + x3
         x8 + x6
       -------------------
         x5 + x3

遵循相同的模式,直到红利的最大期限小于除数的最大期限。计算完成后,它将如下所示:

        x5 + x2
       -------------------
x3 + x ) x8 + x6 + x5 + x3
         x8 + x6
       -------------------
         x5 + x3
         x5 + x3
       -------------------
         0

此情况下的提醒为0,表示在传输过程中很可能没有发生错误。

注意:我在上面的示例中将x^y缩短为xy以减少答案中的混乱,因为SO不支持数学方程格式化。

注意2:从被除数中加上/减去除数的倍数也会给出提醒0,因为(P(x) + a*C(x)) / C(x) = P(x)/C(x) + a*C(x)/C(x)提供与P(x)/C(x)相同的提醒,因为a*C(x)/C(x)的提醒为0

答案 2 :(得分:1)

它是二进制11的长除法。Wikipedia上有一个例子。