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

7 选择一个poly (作者版权声明见本系列第一篇)
     选择一个poly是一个近乎黑艺术的事情,读者可以参考[Tanenbaum81](130-132页),那里有一个关于此问题的清晰讨论。这一部分只是专注于让那些胆大到想自己寻找poly的人们心生畏惧。如果你不在乎关于为什么一个poly比另外一个好,只是想弄明白一个高速实现是怎么回事,那么 只需要找到在本部分后面列出的poly中的一个,跳到下一个章节。
    首先注意到传送的信息T是一个poly的倍数。注意到1)最后的W位是附加过0后的信息被除后的余数,2)加法是和减法一样的,把余数回加到值中,参与到下次乘法中。现在,如果传送的信息在传送过程中崩坏掉了,我们会接收到一个T+E的信息,E是一个错误的向量(这里“+”是CRC加法(也就是XOR))。一旦接收到这个信息,接收者用G去除T+E。正如T对G取余是0,(T+E)%G=E。这样的话,我们选择捕捉特定错误的poly的能力将由G的倍数组成的数列决定,对于任何崩坏的却恰好是G的倍数的E,不会被检测到。我们的任务就是找出一类G,它们的倍数们跟任何我们能想到的噪声(造成差错 )都尽可能地不相似。来吧,让我们找出我们期望的线噪声。
单个位差错:一个位出现差错,也就是E=10000...000。我们可以保证,这种类型的差错可以被有至少有2个1的G检测到。任何G的倍数将可以通过G的移位与相加得到,却是不可能通过一个有多个1的数字经过移位与相加得到一个只有一个1的数字,因为两个端部的1总是不能消除的。
两个位差错:为了能检测到所有形如100...000100..000的错误(也就是说E包含了两个1),选择一个G,它没有如下的倍数11,101,1001,10001,100001, 诸如此类。我不太明白这是什么原理(我没有深厚的数学背景),但是Tanenbaum向我们保证,这样的G是存在的,如G有(15,14,1)三个位置1时,举出的例子是这样的,它除1...1外不会整除其他数,这里,中间的省略号(...)为32767个0。
有奇数个位差错:我们可以捕捉到此类差错,当E有一个奇数位的位数,通过选一个这样的G,有奇数个位数。为了能明白这点,1)CRC仅仅是在各个偏移位上,XOR一个常数,结果加入到寄存器中。2)XOR 是一个简单的位翻转操作。3)如果你用一个奇数位的值XOR了一个值进入到寄存器中,寄存器中的1的数量的奇偶性是不变的。如:以E=111开始,通过重复与11在第1个或者第2个偏移位上进行XOR操作,(也就是 E =E XOR 011, E = E XOR 110),这有点近似是“翻转玻璃杯”的聚会游戏,通过轮流翻转2个杯子,与人对决,看谁先能把三个杯子全部倒扣过来。大部分的CRC多项式包含奇数个1.(注:Tanenbaum表示通过把G设置为11的倍数可以捕捉到更多的差错。)
井喷式差错:一个井喷式差错看起来如E= 000...000111...11110000...00。也就是,E除了内部的一串连续的1,其他的都是0。这样也可以写作E=(10000...00)(1111111...111) ,这里,有z个0在左边,n个1在右边。为了能捕捉到此类错误,我们简单地把G的最低位设为1.这样做保证左边不可能是G的因子。然后,只要G比右边要更宽,差错就会被检测到。可以去Tanenbaum那里找到更详细的解释。我关于这一点有点困惑。注:Tanenbaum确信,一个比W长的井喷式错误的机率是0.5^W。
这部分总结了关于选择多项式的精妙技巧。
有些流行的多项式有:
16位:    (16,12,5,0)    [ X25 标准]
    (16,15,2,0)    ["CRC-16"]
32位:    (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值