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

本文档详细解释了CRC(循环冗余码校验)算法及其表驱动实现,旨在提供清晰易懂的CRC理解。作者提出了一种参数化的CRC算法模型,可用于评估不同CRC算法。内容包括低速和高速CRC实现,以及生成索引表的程序。
摘要由CSDN通过智能技术生成

说下翻译的目的吧,一方面是自己对CRC差错检测算法比较感兴趣,想把它弄明白。另一方面,在网上看过许多介绍这篇文章,却没有找到有中文的翻译。自己英文水平还可以,本着开源分享的精神,就试着把它翻译过来放在博客里,方便英文蹩脚的同学学习。有翻译不当的地方,请大家指正。原文在网上随处可见,我就不再列出了。

虽然说个别的地方说的不是很清楚(让读者去看参考文献),整体上对理解CRC算法还是有帮助的。

版权声明:

Copyright(C) Ross Williams, 1993. However, permission is

granted to make and distribute verbatim copies of this

document provided that this information block and copyright

notice is included. Also,the C code modules included

in this document are fully public domain.(出于对原作者的尊重和版权要求保留此段原文)

正文:

摘要

 这个文档全面而精详地解释了一些CRC(循环冗余码校验)算法和它们基于表驱动的实现。许多关于CRC算法的文献,特别是它们关于表驱动实现的部分,十分晦涩难懂(至少对我来讲是的)。这个文献尝试提供一种清晰、简单而有意义的关于CRC算法的解释,绝对把关于它们高速实现过程的每个细节角落全部覆盖。另外,这个文献提出了一个参数化的CRC算法模型,我叫它”CRC Rocksofttm模型算法”。赋以特定的参数这个模型可以来像大部分CRC算法实现一样工作,因此可以作为评价其它特定算法的标尺。关于一个低速的CRC算法模型,文献中给出了一个用C语言的实现。最后部分给出两种形式的高速实现,并给出了一个生成索引表的程序。

1、引言:差错检测

差错检测技术目的在于使接收者可以判断出经过一个有噪声的信道传输过来的信息是不是正确的。为了达到这样的目的,信息的发送者根据要发送的信息计算出一个值(叫校验和),把它追加到信息的后面。然后,接收者就可以用同样的方式计算出接收到的信息的校验和,把它与附加在信息后面的校验和做比较,以判断接到的信息是否是正确的。例如,如果我们选择了这样一个校验和函数,它仅仅是把信息的各个字节求各然后对256取余(即检验和%256),然后这个计算过程就如下。所有的数字都是10进制的。

信息: 6 23 4

带有校验和的信息: 6 23 4 33

经过传输的信息: 6 27 4 33

在上述的信息中,第2个字节由23经过信道传输时变成了27。当然,接收者可以通过比较接收到的校验和(33)来检测到,实际计算到的校验和为37(6+27+4)。如果校验和自身是有差错的,一个正确的信息会被当成是有差错的。然而,这是良性的误判。还有一类是危险的误判,当消息和校验和以一种特定的形式出现差错,而却保持了内在的一致性,差错不会被检测出。不幸的是,这样的可能性是不可避免的,我们能做的最好的通过增加校验和中的信息量来最小化这种可能性。(如,把校验和的长度从1个字节加到2个字节)。

其他现在的差错检测涉及到对信息进行复杂的变换操作,以便于得到其中的冗余信息。这个文档只着重解释CRC算法,CRC算法属于对数据无伤而在信息的尾部附加校验和的算法中的一种。也就是如下的形式:

<原始完整的信息><校验和>

2. 复杂必要性

在前一部分的校验和示例中,我们看到一个有差错的消息通过一个校验和来检测,这个校验和只是简单把信息中各个字节相加对256取余。

信息: 6 23 4

带有校验和的信息: 6 23 4 33

经过传输的信息: 6 27 4 33

这个算法有一个问题,它太简单了。如果一个数字随机出现差错,那么就有1/256的机率不会被检测到。如:

信息: 6 23 4

带有校验和的信息: 6 23 4 33

经过传输的信息: 8 20 5 33

为了加强这个算法的功能,我们可以把8位的寄存器变为16位的寄存器(也就是说各个字节的各对65536取余,而不是256),以便于地把失败的机率由1/256显著地减小到1/65536。这基本上来看是个好主意,这里却不行,因为使用的公式不够“随机”;无论寄存器有多宽,简单把各个字节相加,每一个参与运算的字节,都只影响到和的1个字节。例如:在上面的第2例子中,放和的寄存器可以是1M字节宽的,而且,差错仍然是无法检测出来的。这个问题,只能通过更换一个更复杂的计算公式来解决,以便于每1个字节都能对整个校验和有影响。

这样的话,我们可以看到,一个强大的校验和函数,至少取决于2个方面:

宽度:一个足够宽的寄存器,可以提供低的误判的概率(如:32位可以达到1/2^32的误判率)

混沌性:一个计算公式,这个公式可以使每个参与运算的字节具备影响校验和的任意位数值的能力。

注意:术语“校验和”是认为是用来描述早期的求和公式,但是现在被赋以其更广泛的含义,以包更加复杂的算法,如CRC类算法。将要描述的CRC算法被认为很好满足了第2个条件,而且可以通过配置以灵活地适应不同的检验和宽度。

变更:

1. 2022-04-13 更正翻译遗漏和错别字

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值