我正在努力记住如何计算数学以计算循环冗余校验中的XOR算法的剩余部分,以验证网络消息的其余位。
我不应该扔那本教科书。
这很容易在代码中完成,但它是如何手工解决的?
我知道它看起来像一个标准的分割算法,但我不记得从那里去哪里得到余数。
___________
1010 | 101101000
注意:我确实谷歌了,但无法找到他们在计算剩余部分时的步骤。
答案 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上有一个例子。