常用检错算法分析及实现
- 格式:docx
- 大小:46.78 KB
- 文档页数:4
各种校验码校验算法分析二进制数据经过传送、存取等环节会发生误码1变成0或0变成1这就有如何发现及纠正误码的问题。
所有解决此类问题的方法就是在原始数据数码位基础上增加几位校验冗余位。
一、码距一个编码系统中任意两个合法编码码字之间不同的二进数位bit数叫这两个码字的码距而整个编码系统中任意两个码字的的最小距离就是该编码系统的码距。
如图1所示的一个编码系统用三个bit来表示八个不同信息中。
在这个系统中两个码字之间不同的bit数从1到3不等但最小值为1故这个系统的码距为1。
如果任何码字中一位或多位被颠倒了结果这个码字就不能与其它有效信息区分开。
例如如果传送信息001而被误收为011因011仍是表中的合法码字接收机仍将认为011是正确的信息。
然而如果用四个二进数字来编8个码字那么在码字间的最小距离可以增加到2如图2的表中所示。
信息序号二进码字 a2 a1 a0 0 0 0 0 1 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 图 1 信息序号二进码字 a3 a2 a1 a0 0 0 0 0 0 1 1 0 0 1 2 1 0 1 0 3 0 0 1 1 4 1 1 0 0 5 0 1 0 1 6 0 1 1 0 7 1 1 1 1 图 2 注意图8-2的8个码字相互间最少有两bit 的差异。
因此如果任何信息的一个数位被颠倒就成为一个不用的码字接收机能检查出来。
例如信息是1001误收为1011接收机知道发生了一个差错因为1011不是一个码字表中没有。
然而差错不能被纠正。
假定只有一个数位是错的正确码字可以是100111110011或1010。
接收者不能确定原来到底是这4个码字中的那一个。
也可看到在这个系统中偶数个2或4差错也无法发现。
为了使一个系统能检查和纠正一个差错码间最小距离必须至少是“3”。
最小距离为3时或能纠正一个错或能检二个错但不能同时纠一个错和检二个错。
USB3.0中的CRC校验原理及实现王良俊;马琪【摘要】CRC is an important error detection measure which protects over control and data fields in USB specification.The basic packet format and characteristics of CRC computation in USB3.0 are analyzed. The parallel circuits of CRC generation in transmitter and CRC detection in receiver are designed, which can detect whether the packets in the event of damage during transport. At last, Simulation results prove its validity. Compared with traditional serial circuit, the parallel circuit for which the clock frequency can be reduced, the circuit can be achieved easily and the power consumption can be significantly reduced.%循环冗余码(CRC)是USB协议中重要的错误检测措施.在此分析了USB 3.0数据包的基本格式以及USB 3.0协议中CRC校验的特点,针对USB 3.0数据高速传输的要求,设计实现并行发送端CRC产生和接收端CRC校验电路,功能仿真结果证明了其有效性.【期刊名称】《现代电子技术》【年(卷),期】2011(034)018【总页数】3页(P170-171,174)【关键词】USB 3.0;CRC校验;Verilog HDL代码;仿真结果【作者】王良俊;马琪【作者单位】杭州电子科技大学微电子CAD研究所,浙江杭州310037;杭州电子科技大学微电子CAD研究所,浙江杭州310037【正文语种】中文【中图分类】TN919-34在通用串行总线(USB)的数据传输过程中,数据循环冗余校验(CRC)[1]是为了保证数据传输中数据的正确性而采用的数据保护方法。
crc 学习计划第一部分:CRC概念及原理1.1 CRC的定义和作用CRC(Cyclic Redundancy Check)是一种检错技术,用于对数据进行检验和验证,以确保数据传输的准确性和完整性。
CRC通常用于数据通信中,可以帮助检测数据在传输过程中是否发生了错误,从而保证数据的可靠性。
1.2 CRC的工作原理CRC利用生成多项式和除法的原理来计算数据的校验码,然后将校验码附加到数据中传输。
接收端在接收数据时,也利用相同的生成多项式和除法计算出校验码,然后对比接收到的校验码和计算出的校验码,以判断数据是否正确。
1.3 CRC的应用领域CRC广泛应用于网络通信、存储系统、电子设备、传感器等领域,以确保数据传输的可靠性和完整性。
CRC技术可以有效防止传输过程中数据的错误、丢失和篡改,提高数据通信质量和可靠性。
第二部分:CRC算法和实现2.1 CRC算法的分类CRC算法可以分为多种不同的类型,如CRC-8、CRC-16、CRC-32等,每种类型都有不同的生成多项式和校验位数,适用于不同的应用场景。
2.2 CRC算法的实现方法实现CRC算法可以采用硬件和软件两种方式,硬件实现通常采用专用的CRC校验器或FPGA实现,软件实现通常采用编程语言实现。
2.3 CRC算法的性能评估CRC算法的性能可以通过计算机模拟、实际测试和理论分析等方式进行评估,主要包括计算速度、校验效率、错误检测能力和适用范围等指标。
第三部分:CRC技术的应用案例3.1 CRC在通信领域的应用CRC技术在通信领域广泛应用于以太网、无线通信、卫星通信等领域,以确保数据传输的安全可靠。
3.2 CRC在存储系统的应用CRC技术在硬盘、闪存、光盘等存储系统中应用,用于检测和纠正数据在存储和读取过程中的错误。
3.3 CRC在电子设备的应用CRC技术在传感器、嵌入式系统、智能手机等电子设备中应用,保障数据采集和传输的质量和准确性。
第四部分:CRC学习计划4.1 CRC基础知识的学习学习CRC的基础知识,包括CRC的概念、原理和应用领域,掌握CRC的基本概念和工作原理。
0-add8 校验公式解释说明以及概述1. 引言1.1 概述在计算机科学和信息技术领域中,数据校验是一项重要的任务。
当我们处理大量数据或进行数据传输时,错误可能会发生,因此需要一种有效的机制来检验数据的完整性和准确性。
0-add8 校验公式作为一种常用的校验方法,在信息领域得到广泛应用。
1.2 文章结构本文将对0-add8 校验公式进行详细解释和说明。
首先,我们会介绍该校验公式的定义、背景以及算法和计算过程。
接下来,我们将探讨该校验公式在数据传输、存储系统以及其他领域中的应用。
然后,我们将与其他常见的校验方法进行比较,如奇偶校验、循环冗余校验(CRC)以及海明码。
最后,我们将总结本文内容并展望未来发展方向或实际应用前景。
1.3 目的本文旨在提供读者对于0-add8 校验公式的全面理解。
通过解释该校验公式的定义、背景和算法,读者可以清晰地了解其工作原理和计算过程。
此外,文章还探讨了该校验公式在不同领域中的应用,帮助读者认识到其实际价值和意义。
最后,通过与其他常见的校验方法进行比较,读者可以了解到0-add8 校验公式相对于其他方法的优势和局限性。
以上是“1. 引言”部分的内容,将该内容进行排版和格式化后即可完成该部分的撰写。
2. 0-add8 校验公式解释说明2.1 校验公式的定义和背景:0-add8校验公式是一种数字校验方法,主要用于检测传输或存储的数据中是否存在错误。
该校验公式是通过在原始数据中添加一个特定的位数所得到的。
它可以检测出多种错误类型,包括单比特错误、位漂移以及部分字节翻转等。
2.2 校验公式的作用和意义:0-add8校验公式在各个领域中都有广泛的应用,主要目的是确保数据的完整性和准确性。
通过将校验码附加到原始数据中,在数据传输或存储过程中对其进行验证,可以发现并纠正潜在的错误。
这有助于避免误操作、数据丢失或损坏,并提高系统可靠性和安全性。
2.3 校验公式的算法和计算过程:0-add8校验公式使用位运算来计算校验码并添加到原始数据中。
循环冗余校验及其算法实现(不用看了,我没有实现这个程序,只是为了交给胡建伟老师的作业而已)作者:学号:一、简介CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
本文主要分析CRC的原理,并通过C语言程序实现由数据产生其FCS的过程。
二、原理分析循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。
对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。
根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*x R),这样C(x)的右边就会空出R位,这就是校验码的位置。
用 C(x)*x R除以生成多项式G(x)得到的余数就是校验码。
简单来说:1.在发送端,先把数据划分为组。
假定每组 k 个比特。
假设待传送的一组数据 M = 101001(现在 k = 6)。
我们在 M 的后面再添加供差错检测用的 n 位冗余码一起发送用二进制的模 2 运算进行 2n 乘 M 的运算,这相当于在 M 后面添加 n 个 0。
得到的 (k + n) 位的数除以事先选定好的长度为 (n + 1) 位的除数 P,得出商是 Q 而余数是 R,余数 R 比除数 P 少1 位,即 R 是 n 位。
现在 k = 6, M = 101001。
设 n = 3, 除数 P = 1101,被除数是 2nM = 101001000。
模 2 运算的结果是:商 Q = 110101,余数 R = 001。
引言CRC 的全称为Cyclic Redundancy Check ,中文名称为循环冗余校验。
它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
实际上,除数据通信外,CRC 在其它很多领域也是大有用武之地的。
例如我们读软盘上的文件,以及解压一个ZIP 文件时,偶尔会碰到“Bad CRC ”错误,由此它在数据存储方面的应用可略见一斑。
CRC 的算法与实现,对原理只能捎带说明一下。
若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。
利用CRC 进行检错的过程可简单描述为:k 位二进制码序列,以一定的规则产生一个校验用的r 位监督码(CRC 码),附在原始信息后边,构成一个新的二进制码序列数共k+r 位,然后发送出去。
CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则,在差错控制理论中称为“生成多项式”。
1 代数学的一般性算法在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。
例如 1100101 表示为1·x^6+1·x^5+0·x^4+0·x^3+1·x^2+0·x+1,即 x^6+x^5+x^2+1。
设:编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k ;生成多项式为G(x),G(x)的最高幂次等于r ;CRC 多项式为R(x);编码后的带CRC 的信息多项式为T(x)。
发送方编码方法:将P(x)乘以x^r(即对应的二进制码序列左移r 位),再除以G(x),所得余式即为R(x)。
用公式表示为()()()r T x x P x R x =+接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。
举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC 的过程为()()()()3326532333 111r x x x x P x x x x x x x G x x x x x x x ++==+++++++++= 即R(x)=x 。
各种校验码校验算法分析校验码校验算法是一种用于数据传输或存储中验证数据完整性和准确性的技术,它能够检测出数据在传输或存储过程中是否发生了错误或损坏,从而确保数据的可靠性。
在实际应用中,校验码校验算法广泛应用于通信、网络传输、存储和数据处理等领域,其设计和选择对数据可靠性和安全性至关重要。
常见的校验码校验算法包括奇偶校验码、循环冗余校验码(CRC)、校验和、哈希校验码等。
下面将对这几种常见的校验码校验算法进行详细分析:1.奇偶校验码:奇偶校验码是最简单的一种校验码校验算法,它通过检测数据中的奇偶位来判断数据是否正确。
在奇偶校验中,通常规定数据中的位数为偶数个或奇数个,如果数据中出现奇数个1,则在校验位中加上1,使总的1的数量为偶数;如果数据中出现偶数个1,则在校验位中加上0,使总的1的数量仍为偶数。
在数据传输或存储中,接收方会通过比较校验位和数据位的和是否为偶数来判断数据的正确性。
奇偶校验码虽然简单易实现,但只能检测出奇数个错误位(例如一个错误的位),并不能检测出多个错误位或连续错误的情况。
因此,奇偶校验码一般用于对数据传输的基本错误进行检测。
2.循环冗余校验码(CRC):CRC是一种基于多项式除法的校验码校验算法,它通过对数据进行特定的多项式运算来计算出校验码。
接收方在收到数据后,也会对数据进行相同的多项式运算,然后比较计算出的校验码与发送方发送的校验码是否一致,从而判断数据是否正确。
CRC校验码具有较高的检错能力和容错率,能够有效地检测出多个位错误和定位错误的位置,因此广泛应用于计算机网络传输、磁盘存储、通信协议等领域。
3.校验和:校验和是一种简单的校验码校验算法,它通过对数据中所有位进行求和操作来计算出校验码。
接收方在接收到数据后,也会对数据进行相同的求和操作,然后比较计算出的校验和与发送方发送的校验和是否一致,从而判断数据是否正确。
校验和算法比较简单,计算速度较快,但只能检测出简单的错误情况,对于复杂的错误或多位错误检测能力有限。
CRC介绍CRC 检验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
接收端根据同样的规则校验,以确定传送中是否出错。
接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。
2、计算整个k+r 位的CRC码,若为0,则接收正确。
一般数据量不大时,使用Checksume验错方式就行了;数据量大时,就用CRC了;据理论统计,用CRC16时,超过17个连续位的错误侦测率为99。
9969%,小于此的为100%。
CRC算法一般作为冗余校验之用,由于它的可逆性的不完整,导致了正规的CRC 算法不能称之为CRC密码。
CRC之精华由初值、权、方向及位数组成,对其输入(明文)做CRC正运算得到输出的结果(密文)。
即:密文=CRC正运算(初值,权,方向,位数,明文);反之,对其输出(密文)做CRC逆运算得到CRC的结果(明文)。
即:明文=CRC逆运算(初值,权,方向,位数,密文);但要想实现CRC的可逆运算,必须满足:CRC右移时,CRC权的最高位为1. CRC左移时,CRC权的最低位为1。
但是传统的CRC算法是:本次的CRC初值是上次CRC运算的结果即密文。
这是CRC算法不能成为CRC密码的最大败笔所在!!!关于CRC算法,知其然,如果再知其所以然,事情就会清楚了。
CRC算法,最重要的参数当然是生成多项式(CRC Polynomial),但(余数)初值和CRC数据最高位的位置也是很重要的两个参数,而这两个参数需要根据具体情况具体分析的。
初值一般是全0或者全1,CRC数据最高位一般在最低字节的最低位或者最高位。
CRC算法,作为一种检错算法,它的着眼点是出错概率高地方的错误,这在一定程度上决定了后两个参数。
下面举例来说明。
1.串口通信在通信电缆的出错概率高,而串口数据是从LSb先发送,所以比较合理的做法是 CRC数据最高位是第1个被发送字节的最低位。
计算机循环冗余校验算法分析【摘要】计算机循环冗余校验算法(CRC)是一种常用于数据传输中的错误检测技术。
本文首先介绍了CRC算法的原理与特点,包括通过计算数据的余数来检测传输中的错误。
接着探讨了CRC算法在通信、存储等领域的广泛应用,并详细描述了CRC算法的实现方式,包括选择多项式和生成校验码等步骤。
对CRC算法的性能进行了评估,包括检测能力和误差检测率等指标。
分析了CRC算法的优缺点,指出其高效性和稳定性,但也存在计算复杂度高和容易受到干扰的缺点。
CRC算法在实际应用中具有重要意义,需要在平衡性能和成本的基础上进行合理选择和应用。
【关键词】计算机、循环冗余校验算法、CRC算法、原理、特点、应用领域、实现方式、性能评估、优缺点、分析、结论1. 引言1.1 计算机循环冗余校验算法分析计算机循环冗余校验算法(CRC)是一种常用于数据传输中的错误检测算法。
通过对数据进行特定的计算和校验,可以有效地检测传输过程中是否存在数据损坏或错误,保证数据的完整性和准确性。
在计算机网络、存储系统、通信设备等领域广泛应用。
CRC算法的原理是利用多项式除法的原理,通过生成一个循环冗余校验码,并将其附加到数据末尾。
接收端根据相同的生成多项式对接收到的数据进行计算,如果计算结果为0,则认为数据传输正确;如果计算结果不为0,则表示数据损坏或错误。
CRC算法的实现方式通常使用硬件电路或软件算法来实现。
硬件实现速度快,但成本较高;软件实现灵活,适用范围广。
性能评估方面,CRC算法在数据传输的可靠性和效率方面表现优异,能够有效检测出大多数错误。
优点包括高效的错误检测能力和简单的实现方式,缺点则是无法纠正错误,只能检测错误。
综合来说,CRC算法在数据传输中发挥着重要作用,是保证数据安全和可靠性的重要手段。
的研究和应用将会在未来得到更广泛的发展和应用。
2. 正文2.1 CRC算法的原理与特点CRC算法是一种常用的循环冗余校验算法,它通过对数据进行除法运算来生成校验码,以检测数据传输中的错误。
循环冗余校验CRC的算法分析和程序实现西南交通大学计算机与通信工程学院刘东摘要通信的目的是要把信息及时可靠地传送给对方,因此要求一个通信系统传输消息必须可靠与快速,在数字通信系统中可靠与快速往往是一对矛盾。
为了解决可靠性,通信系统都采用了差错控制。
本文详细介绍了循环冗余校验CRC (Cyclic Redundancy Check)的差错控制原理及其算法实现。
关键字通信循环冗余校验CRC-32 CRC-16 CRC-4概述在数字通信系统中可靠与快速往往是一对矛盾。
若要求快速,则必然使得每个数据码元所占地时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误地可能性增加,传送信息地可靠性下降。
若是要求可靠,则使得传送消息地速率变慢。
因此,如何合理地解决可靠性也速度这一对矛盾,是正确设计一个通信系统地关键问题之一。
为保证传输过程的正确性,需要对通信过程进行差错控制。
差错控制最常用的方法是自动请求重发方式(ARQ)、向前纠错方式(FEC)和混合纠错(HEC)。
在传输过程误码率比较低时,用FEC方式比较理想。
在传输过程误码率较高时,采用FEC容易出现“乱纠”现象。
HEC方式则式ARQ和FEC 的结合。
在许多数字通信中,广泛采用ARQ方式,此时的差错控制只需要检错功能。
实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。
接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。
但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二元码组。
编码简单且误判概率很低,在通信系统中得到了广泛的应用。
下面重点介绍了CRC校验的原理及其算法实现。
一、循环冗余校验码(CRC)CRC校验采用多项式编码方法。
CRC 校验码的计算方法CRC从原理到实现===============作者:Spark Huang(hcpp@)日期:2004/12/8摘要:CRC(Cyclic Redundancy Check)被广泛用于数据通信过程中的差错检测,具有很强的检错能力。
本文详细介绍了CRC的基本原理,并且按照解释通行的查表算法的由来的思路介绍了各种具体的实现方法。
1.差错检测数据通信中,接收端需要检测在传输过程中是否发生差错,常用的技术有奇偶校验(Parity Check),校验和(Checksum)和CRC(Cyclic Redundancy Check)。
它们都是发送端对消息按照某种算法计算出校验码,然后将校验码和消息一起发送到接收端。
接收端对接收到的消息按照相同算法得出校验码,再与接收到的校验码比较,以判断接收到消息是否正确。
奇偶校验只需要1位校验码,其计算方法也很简单。
以奇检验为例,发送端只需要对所有消息位进行异或运算,得出的值如果是0,则校验码为1,否则为0。
接收端可以对消息进行相同计算,然后比较校验码。
也可以对消息连同校验码一起计算,若值是0则有差错,否则校验通过。
通常说奇偶校验可以检测出1位差错,实际上它可以检测出任何奇数位差错。
校验和的思想也很简单,将传输的消息当成8位(或16/32位)整数的序列,将这些整数加起来而得出校验码,该校验码也叫校验和。
校验和被用在IP协议中,按照16位整数运算,而且其MSB(Most Significant Bit)的进位被加到结果中。
显然,奇偶校验和校验和都有明显的不足。
奇偶校验不能检测出偶数位差错。
对于校验和,如果整数序列中有两个整数出错,一个增加了一定的值,另一个减小了相同的值,这种差错就检测不出来。
2.CRC算法的基本原理-------------------CRC算法的是以GF(2)(2元素伽罗瓦域)多项式算术为数学基础的,听起来很恐怖,但实际上它的主要特点和运算规则是很好理解的。
几种常用检错算法分析及实现
简介:
在进行通信的过程中,信道中的各种干扰有可能使通信的内容发生差错;在进行信息的长
期存储时.由于时变效应,所存储的信.态有可能因为存储介质的性质退化而发生一些改变。
为提高信息在通信或存储过程中的准确性,一般要在通信或存储前进行一次编码.使出现的绝
大多数差错都能及时发现,这种编码就是“校验码”,有了校验码就不会把错误的信息当作正
确的信息加以利用,造成不良后果。
在发现错误后可以要求重发,直到接收到正确的信息为止。
常见的几种校验方式有:奇偶校验,求和校验,LRC校验,CRC校验。
奇偶校验
最常见的校验码是奇偶校验码,它在原编码的基础上增加了一位奇偶校验位,使得整个编
码1的个数固定为奇数(奇校验)或偶数(偶校验),如表1所列。
在信息的传输过程中,如
果有奇数位代码发生改变,校验码的奇偶性(1的个数)就会发生变化.从而检查出差错。
如
果有偶数位代码发生改变.则码的奇偶性(1的个数)不变,这时就检查不出筹错。
通过概率
分析可以得知,如果发生一个位差错的概率为p,则发生两个位差错的概率大约为p²/2.因为
p是一个很小的值(例如p=0.001),发生更Array多差错的概率就更小。
因此,绝大多数都是
一个位差错的情况,而奇偶校验可以发现一
个位差错,故具有很高的实用性。
它是由
n-1位信息元和1位校验元组成,可以表示
成为(n,n-1)。
如果是奇校验码,在附加
上一个校验元以后,码长为n的码字中“1”的个数为奇数个;如果是偶校验码,在附加上一
个校验元以后,码长为n的码字中“1”的个数为偶数个。
设:如果一个偶校验码的码字用
A=[a n-1,a n-2,…,a1,a0]表示,则:[a n-1,a n-2,…,a1,a0]=0。
这个式子通常被称为校验方程。
由信息元即可求出校验元。
另外,如果发生单个(或奇数个)错误,就会破坏这个关系式,因此通过该式能检测码字中是否发生了单个或奇数个错误。
因为奇校验不能产生全0的代码一般很少使用,常用的奇偶校验码是“偶校验码”。
和校验
当干扰持续时间很短(如常见的尖峰干扰)时,差错一般是单个出现.这时采用奇偶校验
可以有效地达到检错的目的.们也有一些突发性干扰的持续时间较长(如雷电、电源波动等),
会引起连续几个位差错.在进行信息存储时.存储介质的缺陷也会引起连续几个位差错。
如果
差错数是2、4、6个,简单的奇偶校验就不能发现差错,这时可以采用“和校验”。
如果一串信息有n字节,对这,字节进行“加”运算,然后将结果附在n字节信息后面一起传送(或存储),这附加的字节就是“校验和”。
接收方按相同的算法对这n字节信息进行运算,将运算结果与附加的校验字节进行比较.从而判断有无差错。
这种检错方式就是“和校验”。
在这里所谓的“加”运算有两种,一种是模2加(按位加),采用按位“异或”操作指令来完成;另一种是算术加(按字节加),采用加法指令来完成。
两种算法的检错效果相同。
纵向冗余校验(LRC)
纵向冗余校验(LRC,Longitudinal Redundancy Check)是通信中常用的一种校验形式。
纵向冗余校验(LRC)是一种从纵向通道上的特定比特串产生校验比特的错误检测方法。
在行列格式中(例如,在磁带中),LRC经常是与VRC一起使用,这样就会为每个字符校验码。
LRC域是一个包含一个8位二进制值的字节。
LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。
LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。
计算方法1:
取反后加1B:把数据转换为二进制,每位取反后再加1B。
例如:0AH=00001010B,按位取反后得11110101B,11110101B+1B=11110110B=F6H,0AH的二次反补就是F6H。
取反后加1H:把数据转换为二进制,每位取反后再加1H。
例如:0AH=00001010B,按位取反后得11110101B=F5H,F5H+1H=F6H,0AH的二次反补就是F6H。
计算方法2:
有个简单算法就是:这个十六进制值有几位数,就把高于这个位数的最小值减去这个值。
如果16进制数有2位,那么高于2位的最小值就是100H,用100H 减去这个数就是其二次反补。
实际上,该方法的原理和方法1相同:以2位16进制数为例,FFH减去那个数就是把那个数取反(FFH的数据为全1,减去那个数的结果就是原来1的位数变为0,原来0的位数变为1),而FFH+1H=100H。
所以取反然后加一就等于100H减去这个数。
0AH的二次反补就是:100H-0AH=F6H
循环冗余检验(CRC)
应用最广泛、功能最强大的校验码是循环冗余校验码CRC (Cyclical Redundancy Check)。
CRC 的基本原理是将一段信息看成一个很长的二进制数(例如将一段128字节的信息看成一个1024位的二进制数).然后用一个特定的数(例如二进制数10001000000100001B,即十六进制数
0x11021)去除它,最后将余数作为校验码附在信息代码之后一起传送(或存储)。
在进行接收(或读出)时进行同样的处理,若有差错即可发现。
据文献资料分析,当采用余数为16位的
CRC时,它的错误发现率如下:
单个位的差错:100% 比16位短的突发性差错:100%
两个位差错:100% 恰好17位的突发性差错:99.9969%
奇数个位差错:100% 其他所有的突发性差错:9
如此强大的检错能力使CRC广泛地使用在数据存储与数据通信中,并且在国际上已经形成规范,以硬件形式放入磁盘骆动器和通信产品中。
任意一个由二进制位串组成的代码都可以与一个系数仅为“0”和“1”的多项式一一对应。
例如:代码1010111B对应的多项式为1x6+0x5+1x4+0x3+1x2+1x1+1x0,即x6+x4+x2+x+1;而多项式为x5+x3+x2+x+1对应的代码101111B。
设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。
发送方编码方法:将P(x)乘以x r,(即对应的二进制码序列左移r位,右边填补r个零),再除以G(x).所得余式即为R(x)。
用公式表示为:T(x)=x2P(x)+R(x)。
接收方解码方法:将T(x)除以G(x),如果余数为O,则说明传输中无错误发生,否则说明传输有误。
举例说明,设信息码为1101100111,生成多项式为100010000001000011B,即:
P(x)=x7+x6+x4+x3+1,G(x)=x16+x12+x5+1。
计算CRC的过程为:首先将原始信息码左移16位,变为110110010000000000000000B,再除以10001000000100001B。
不过在这里所用的除法是模2除法,并非算术除法。
模2除法的操作过程是:从被除数高端
(数据串的开始端)开始,取与除数相同的
比特,如果最高位为0,得1比特的商0,被
除数不用减去除数;如果最高位为1,得l
比特的商l,被除数就要减去除数。
用“异
或”操作代替减法后,由于除数和被除数的
最高位都为1,“异或”操作必然使结果的
最高位为0,故所得余数必然小于除数的比
特数,实际操作时就可以只进行比除数少1
比特的“异或”操作。
整个模2除法的过程
可以概括为从高位到低位按二进制扫描被除数,对每一位进行判断,如果是0,则不用处理;如果是1,就将其后的若1:比特与除数的低若干比特进行“异或”操作。
直至所剩卜的余数比除数少1比特,该余数就是所需的CRC校验码。
附录:CRC校验代码
unsigned int CRC_16(unsigned char *buf,unsigned char len)
{
unsigned int crc_gen = 0xa001; //1,1000,0000,0000,0101B/
unsigned int crc;
unsigned char i,j;
crc = 0xffff;
if (len != 0)
{
for(i = 0;i < len;i++)
{
crc ^= (unsigned int)(buf[i]); //将校验码异或
for(j = 0;j < 8;j++)
{
if (crc & 0x01)
{
crc >>= 1; //crc右移
crc ^= crc_gen;
}
else
crc >>= 1;
}
}
}
return crc; //返回校验结果
} // end crc_16
信息学院陈渡20134601。