轻松理解CRC差错检测算法(A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS)二

来源:互联网 发布:mac查找隐藏缓存视频 编辑:程序博客网 时间:2024/05/09 08:53
3、 CRC算法背后的基本原理(作者版权声明见本系列第1篇)
    那么我们该去哪里找寻一个比求和更加复杂求的计算公式呢?各种方法开始浮现脑海。我们可以使用圆角率的各位数字构建出一个表,或者将输入的各个字节散列。我们可以保有一个大型的在线电话簿,用参与运算的各个字节与寄存器中的各个字节索引出一个新的电话号码,这个号码,将会是下个寄存器中的值。无限可能。
    然而,我们无需想那么多。下一个的运算步骤就足够了。加法明显不是一个好的强大的校验和算法,除法却是的,前提是只要除数是和校验和寄存器一样的位宽。
    CRC算法的基本思想是简单地把信息当成一个巨大的二进制数,用一个固定的二进制数去除它,把得到的余数作为校验和。一旦收到信息,接受者用同样的除法操作,把得到的余数和附加的校验和做比较。例如:假设信息包含2个字节,(6,23),和前面一样。它们可以看成是10进制的0617,进而可以被看成是二进制数:0000-0110-0001-0111。假如我们使用一个单字节的校验和,使用的除数为1001,然后,得到的校验和也就是0000-0110-0001-0111被1001除的余数。一般的情况下,这可能会有问题,但在本例中,计算显然可以使用通常的32位宽寄存器来实现。这样,我们用你在学校学到的长除法(还没有忘记吧?)来运算。除了这次是二进制下的,其他没有什么不同:

    “十进制中就是,1559被9除得到173,余数是2”.尽管输入信息中的每个字节看起来对最终的结果没有那么大的影响,但4位的余数在计算过程中被修改了许多,如果有更多的字节被附加到消息的后面的话,它的值会发生显著的变化。这就是为什么除法可以很好适用,而加法却不行。考虑到你可能会惊讶,用4位的校验和来传输的信息看起来是(十六进制)06172(这里,0617是原始的信息,2是校验和)。接收者将会用0617被 9除,以查看余数是不是2.
4.多项式运算
    尽管前面说的除法的构想和CRC的校验和的算法很相像,CRC的算法实际上要更奇怪一些,我们必须引入一些奇怪的数学理论去理解它。
    这里你经常听到的关于CRC算法的词是多项式,CRC算法一般来说是用多项式实现的。这是什么意思呢?除数,被除数(信息),商,余数(如前面所述),不再被视为正整数,它们会被视作是若干具有二进制系数的多项式。这可以通过把每个数字视为由多项式的系数组成的一个字符串。例如,变通的数字23(十进制)是17(16进制),10111二进制,对应的多项式就是:
1*x^4 + 0*x^3 + 1*x^2 + 1*x^1 + 1*x^0
    或者理简单些是:
x^4 + x^2 + x^1 + x^0
    运用这样的技巧,信息,除数,都可以用多项式来表示,我们和以前一样进行算术运算,除了现在我们要和底数X打交道。例如,例如我们想要把1101和1011相乘。我们可以通过把对应的多项式相乘来实现。
(x^3 + x^2 + x^0) (x^3 + x^1 + x^0) =
(x^6 + x^4 + x^3 + x^5 + x^3 + x^2 + x^3 +x^2 + x^0) =
x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
    到这,为得到正确的答案,我们假设,x是2,从3*x^3向前进位,最后的结果是x^7 + x^3 + x^2 + x^1 + x^0。这只是平常的算术运算,除了底数是抽象的,运算变成了显式的,而非隐式的。这有什么意义?
    这里,如果我们假设我们不知道x是多少,我们不能进行进位。我们不知道3*x^3是和x^4+x^3是一样的,因为我们不知道x是2 。在真实的多项式运算中,系数间的关系是未知的,所以每个幂级的系数都用加粗字体来表示。x^2的系数和x^3的系数是完全不同的类型。
    通过把各个幂级的系数相互隔离开来,数学家们通过改变系数起作用的规则,想出了各种各样的的多项式运算规则。这些规则中的一种,在我们的主题很有关系,它是这样一个多项式运算规则,所有的系数通过对2取模获得,并且没有进位;所有的系数非0即1,进位舍弃。这就叫做2模多项式运算。这样回到之前的例子中:
(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
+ x^5 + x^3 + x^2
+ x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
    在其他的运算规则下,3*x^3这项当基数为x=2时,会被进位到上一个幂级上去。然而在2模运算规则下,我们虽然不知道x是什么,但确定没有进位,所有的系数都是以对2取模得到。这样的话,结果就是:
= x^6 + x^5 + x^4 + x^3 + x^2 + x^1 + x^0
    如Knuth[Knuth81]高教授所述(第400页):
    “读者应该注意到,多项式运算和多精度运算之间的相似之处,把b换成了x。主要的区别是,多项式中x^k的系数u_k与其相邻的x^(k-1)和x^(k+1)的系数几乎没有什么关系,这样从一个地方到另外一个地方的进位也就没有了。实事上,多项式运算的模基数b对于以b为底的多精度运算来说是基本相同的,除了,所有的进位都被抑制了。”
    这样2模基数多项式运算仅仅是2进制对2取模无进位运算。除了在更加精细逼近CRC和差错检测算法中,多项式提供了有用的数学机制,单从表面上来说他们没有提供任何有用的想法,有些多余,在本文之后的部分中都不会被提及,以便于直接处理与其不一样的运算体系:2进制无进位运算。

0 0
原创粉丝点击