crc并行计算公式的直观推导

31 阅读3分钟

最近需要把crc串行计算改为并行,有的算法能找到现成的公式,但自定义的肯定不好找,于是想搞清楚怎么推导。

网上找到的一些文献都比较高端,默认我们还记得信息论或者抽象代数,但我不是没学过就是全还回去了,看着费力。所以,还是用老的笨办法可视化地推导一遍,记下来。

综述

用一个自定义地4位CRC,尝试推导一下,逐渐就理解了线性移位系统,然后就好办了。

默认输入数据,也就是模二除法的高位到低位依次是A1,A2,A3....,

除数,也就是我们的CRC多项式为0x03,也就是10011,

每一步计算的结果,从高位到低位依次是C1,C2,C3,C4,C5

然后计算每一步,记录每一个bit的结果,调用了输入值的哪一个bit,也就是受哪些bit的值的影响。然后层层套娃,最后化简,就得到了完整的流程。

本质上就像口罩初期流行病追溯源头的过程。

image.png

详细推导

第一步

因为多项式已知,也就是除数的每一位已知,直接按照正常crc计算就好。

image.png

  • C1: 理论上由A1和B1比较。若A1为0,则意味着除不开,A1传递,结果为0;若A1为1,则和除数的最高位做异或,结果还是0,所以无论如何,每次计算的C1都为0。
  • C2:根据A1的值来,若A1为0,则传递,结果就是A2;A1为1,则意味着除得开,与B2,也就是0做异或,那就是还是A2。
  • C3:类同C2,结果为A3。由此可以看出,除数某位为0,直接传递就好。
  • C4:这一步得结果受A1影响。如果A1为0,也就是除不开,直接传递A4;如果A1为1,那就需要和B4做异或。也就相当于C4=A4和A1做异或,无论A1和A4的值,C4都为A4^A1。
  • C5:类同C4,结果为A5^A1。

结果显而易见,每一步计算时,多项式0对应的位传递,多项式1对应的位与上一步的C1做异或。这下反过来就理解线性系统了。

2~n 步

后面每一步,都是除数移位,追加数据或者填充0了。然后执行同样的过程。

最后,把CRC结果的表达式化简一下,一个数异或自己等于0,可以消掉了。

image.png

得到了最终CRC值每一位的表达式,然后就可以愉快的进行并行计算了。

验算

把并行计算的公式,找一个串行CRC的计算工具对比测试下。结果没问题

我这里用免费的在线网站 www.ip33.com/crc.html ,感谢其作者。