数据校验技术(CRC,奇偶法)
校验方法

3、生成多项式G(x)的确定
G(x)是一个约定的除数,用来产生校验码。 从检错和纠错的要求出发,它并不是随意选择的, 它应满足下列要求: 任何一位发生错误都会使余数不为0 不同位发生错误应使余数不同 余数继续模2 除,应使余数循环
4.CRC的译码与纠错
将收到的循环校验码用约定的生成多项式G(x)去除,如果
余数将按CRC码的查错表顺序循环。
例如第七位出错,余数将为001,补0后再除,第二次余数
为010,以后依次为100,011,...,反复循环,这是一个有 价值的特点。如果我们在求出余数不为0后,一边对余数补
0继续做模2除,同时让被检错的校验码字循环左移。 CRC
码的查错表说明当出现余数(101)时,出错位也移到A1位 置、通过异或门将它纠正后在下一次移位时送回A1 。继续 移满一个循环(对7、4码共移七次),就得到一个纠正后 的码字。这样我们就不必像海明校验那样用译码电路对每 一位提供纠正条件、当位数增多时循环码校验能有效地降 低硬件代价。
例题:采用4位校验位、偶校验方式,写出 10100110的海明码。
解:已知D8D7D6D5D4D3D2D1=10100110 P1=D1⊕D2⊕D4⊕D5⊕D7 =1 (1)
P2=D1⊕D3⊕D4⊕D6⊕D7 =0 (2) P3= D2⊕D3⊕D4⊕D8 =1 (3) P4= D5⊕D6⊕D7⊕D8 =0 (4) P5=D1⊕D2⊕D3⊕D4⊕D5⊕D6⊕D7⊕D8 ⊕P4⊕P3⊕P2⊕P1 =0 (5) 发送方发送P5D8D7D6D5P4D4D3D2P3D1P2P1=0101000111001
101
除法:当被除数最高位为1时,商1,否则商0。
CRC整个编码长度为 n=k+r 位,故CRC码又叫(n,k)码。 其编码方法如下:
c语言中的校验方法

c语言中的校验方法【引言】在计算机科学中,数据校验是一种重要的技术,可以确保数据的正确性和完整性。
在C语言编程中,校验方法被广泛应用于各种场景,以防止数据损坏或丢失。
本文将介绍C语言中的几种校验方法,并探讨其在实际编程中的应用。
【C语言中的校验方法概述】C语言提供了多种校验方法,以下列举了几种常见的校验方法:1.奇偶校验:奇偶校验是一种简单且常用的校验方法。
它通过计算数据中1的个数来判断数据是否正确。
奇数校验要求数据中1的个数为奇数,偶数校验则要求数据中1的个数为偶数。
2.循环冗余校验(CRC):CRC是一种基于二进制多项式的校验方法。
发送方计算数据多项式与数据位的异或结果,并将结果作为校验码添加到数据末尾。
接收方在接收到数据后,同样计算数据多项式与数据位的异或结果,若与接收到的校验码相同,则认为数据正确。
3.哈希校验:哈希校验是一种基于哈希函数的校验方法。
哈希函数将数据映射为一个固定长度的哈希值,发送方和接收方使用相同的哈希函数计算数据的哈希值,比较结果以判断数据是否正确。
4.编码校验:编码校验是一种基于编码理论的校验方法。
发送方将数据编码为多个码字,并在码字之间添加校验位。
接收方在接收到码字后,检查校验位以判断数据是否正确。
【校验方法在C语言编程中的应用】校验方法在C语言编程中有广泛的应用,以下列举了几个典型场景:1.文件传输校验:在文件传输过程中,可以使用奇偶校验或CRC校验来确保数据的正确性。
发送方计算文件的校验码,并将校验码附加到文件末尾。
接收方在接收到文件后,计算校验码以确保文件在传输过程中未被篡改。
2.数据库校验:在数据库系统中,可以使用哈希校验来确保数据的完整性。
当插入或更新数据时,计算数据的哈希值并存储。
在查询数据时,再次计算哈希值,若与存储的哈希值相同,则认为数据正确。
3.网络通信校验:在网络通信中,可以使用编码校验来确保数据的正确传输。
在发送数据包时,添加校验位并设置校验范围。
差错检测的方法

差错检测的方法差错检测是用于检测数据在传输或处理过程中产生的错误的一种技术。
以下是一些常见的差错检测方法:1. 奇偶校验:奇偶校验是一种基于二进制数的校验方法。
它根据一组二进制位中1和0的个数进行校验。
奇校验要求字符代码中的1的个数为奇数,而偶校验则要求1的个数为偶数。
2. 方块校验:方块校验是在奇偶校验的基础上,在一批字符之后增加一个方块校验字符,使每一纵向位代码中的1的个数为奇数或偶数。
3. 循环冗余校验(CRC):CRC是一种广泛应用于数据传输和存储的校验方法。
它通过生成一个多项式,将发送数据的多项式除以生成多项式,得到一个余数多项式。
接收端使用同样的方法计算余数多项式,与传送的余数多项式进行比较,若结果相同,则表示传输无误;否则表示传输有误。
4. 反馈重发方法:反馈重发方法是一种基于错误纠正的差错检测方法。
当发送端发现错误时,会重新发送错误帧。
接收端收到错误帧后,要求发送端重新发送数据,直到正确无误。
5. 停止等待方式:停止等待方式是一种基于应答的差错检测方法。
发送端发送数据后,等待接收端的应答。
若接收端正确接收数据,则返回确认;若发现错误,则返回重传请求。
发送端根据接收到的应答判断数据是否传输正确。
6. 连续工作方式:连续工作方式是一种不停止发送数据的差错检测方法。
当发现错误时,发送端会回拉到错误处,重新发送错误部分。
7. 拉回式方式:拉回式方式是一种在连续工作方式的基础上进行差错检测的方法。
当发现错误时,发送端会回拉到错误处,重新发送错误部分。
这些方法可以根据实际应用场景和需求进行选择,以实现对数据传输过程中错误的检测和纠正。
数字校验算法

数字校验算法数字校验算法是一种用于验证数据完整性和准确性的数学算法。
它通过对数据进行计算和比较,确定数据是否被篡改或损坏。
数字校验算法广泛应用于计算机网络、数据传输以及存储系统等领域,保证数据的可靠性和安全性。
本文将介绍几种常见的数字校验算法及其原理。
一、奇偶校验算法奇偶校验算法是最简单的数字校验算法之一。
它通过在数据位中添加一个奇偶位来确保数据的正确性。
具体操作是在数据中添加一个位,使得数据位和奇偶位的总位数为奇数或偶数。
接收端通过计算数据位和奇偶位的总位数是否为奇数或偶数来判断数据是否正确。
如果总位数不匹配,则说明数据传输中发生了错误。
二、循环冗余校验算法循环冗余校验算法(CRC)是一种常用的数字校验算法。
它通过对数据进行多项式的除法运算来生成校验码。
发送端首先将数据和生成多项式进行除法运算,得到余数作为校验码,然后将数据和校验码一起发送。
接收端将接收到的数据和生成多项式进行除法运算,如果余数为0,则说明数据传输正确;如果余数不为0,则说明数据传输错误。
三、哈希校验算法哈希校验算法是一种基于哈希函数的数字校验算法。
它通过对数据进行哈希运算,得到一个固定长度的校验值。
发送端将数据和校验值一起发送,接收端对接收到的数据进行相同的哈希运算,并将得到的校验值与接收到的校验值进行比较。
如果两者相同,则说明数据传输正确;如果不同,则说明数据传输错误。
四、消息认证码算法消息认证码算法(MAC)是一种常用的数字校验算法。
它通过对数据进行加密和认证来确保数据的完整性和真实性。
发送端使用密钥对数据进行加密和认证,并将加密后的数据和认证标签一起发送。
接收端使用相同的密钥对接收到的数据进行解密和认证,并将得到的认证标签与接收到的认证标签进行比较。
如果两者相同,则说明数据传输正确;如果不同,则说明数据传输错误。
五、数字签名算法数字签名算法是一种常用的数字校验算法。
它通过使用私钥对数据进行加密和签名,确保数据的完整性、真实性和不可抵赖性。
校验码的3种计算方法

校验码的3种计算方法
校验码是一种用于检测数据传输或存储过程中是否出现错误的技术。
以下是三种常见的校验码计算方法:
1. 奇偶校验(Parity Check):奇偶校验是一种简单的校验码计算方法,它通过检查数据的奇偶性来判断数据是否正确。
如果数据的位数为奇数,则在末尾添加一个校验位,该位的值为0或1,取决于数据的最后一位是否为0。
如果数据的位数为偶数,则在末尾添加两个校验位,每个校验位的值都为0或1,取决于数据的最后一位是否为0。
2. 循环冗余校验(CRC):循环冗余校验是一种更复杂的校验码计算方法,它使用多项式除法和生成多项式来计算校验码。
生成多项式是一个固定长度的多项式,通常为2的n次方减1,其中n是数据位数的二进制表示中最高位的位置。
在计算校验码时,将数据与生成多项式进行异或运算,然后将结果取反并加到生成多项式的系数中。
最后得到的结果就是校验码。
3. 海明码(Hamming Code):海明码是一种基于循环冗余校验的纠错码,它可以在接收端检测到传输中的错误并进行纠正。
海明码使用多个校验位来表示数据,每个校验位都是一个独立的多项式。
在发送端,将数据和所有校验位一起发送给接收端。
接收端首先计算出所有校验位的值,然后将这些值与接收到的数据进行比较。
如果发现任何一位不匹配,则说明传输中出现了错误,接收端可以使用已知的纠错规则来纠正错误并重新发送正确的数据。
数据链路层技术中的错误检测与纠正方法

数据链路层技术是计算机网络中重要的一环,用于确保数据在物理介质上的可靠传输。
而错误检测与纠正方法是数据链路层技术中的关键部分,它能够帮助我们准确判断传输过程中是否出现了错误,并采取相应的措施进行纠正。
一、奇偶校验奇偶校验是最简单的一种错误检测方法,它通过在数据中加入一个校验位,使得数据中1的个数(或者0的个数)为奇数(或者偶数)。
在接收端,通过比较校验位和接收到的数据中1的个数,判断数据是否发生了错误。
这种方法适用于只能发现奇数位错误的场景,但对于多位错误的检测效果较差。
二、循环冗余校验(CRC)循环冗余校验是一种常见的错误检测方法,它通过对数据进行多项式除法来生成冗余校验码。
发送端将数据和冗余校验码一同发送,接收端通过对接收到的数据进行同样的多项式除法运算,如果余数为0,则认为数据传输正确。
但是,循环冗余校验无法进行纠正,只能检测错误,所以在实际应用中通常需要与其他纠错方法结合使用。
三、海明码海明码是一种常见的错误检测和纠正方法,它能够检测和纠正多位错误。
通过对数据进行编码,插入一定数量的冗余位,使得数据满足一定的校验规则。
发送端与接收端都知晓这个校验规则,在接收到数据后,通过比较接收到的数据和校验规则,可以检测出错误的位,并利用冗余位纠正这些错误。
海明码已经广泛应用于存储、通信等领域,具有较强的弥补错误能力。
四、前向纠错码(FEC)前向纠错码是一种能够在接收端纠正错误的编码技术。
发送端根据一定的纠错算法,对数据进行编码,然后发送给接收端。
接收端通过对接收到的数据进行解码,即使在接收到有部分错误的数据时,也能仍然能够正确恢复原始数据。
前向纠错码通常能够处理一定数量的错误位,但也存在着纠错能力限制的问题。
总结:数据链路层技术中的错误检测与纠正方法在保障数据传输可靠性方面起着重要作用。
奇偶校验、循环冗余校验能够发现错误,但不能纠正;海明码可以检测和纠正多位错误,是比较常用的方法;而前向纠错码在纠正错误方面具有更强的能力。
各种校验码校验算法分析

各种校验码校验算法分析校验码校验算法是一种用于数据传输或存储中验证数据完整性和准确性的技术,它能够检测出数据在传输或存储过程中是否发生了错误或损坏,从而确保数据的可靠性。
在实际应用中,校验码校验算法广泛应用于通信、网络传输、存储和数据处理等领域,其设计和选择对数据可靠性和安全性至关重要。
常见的校验码校验算法包括奇偶校验码、循环冗余校验码(CRC)、校验和、哈希校验码等。
下面将对这几种常见的校验码校验算法进行详细分析:1.奇偶校验码:奇偶校验码是最简单的一种校验码校验算法,它通过检测数据中的奇偶位来判断数据是否正确。
在奇偶校验中,通常规定数据中的位数为偶数个或奇数个,如果数据中出现奇数个1,则在校验位中加上1,使总的1的数量为偶数;如果数据中出现偶数个1,则在校验位中加上0,使总的1的数量仍为偶数。
在数据传输或存储中,接收方会通过比较校验位和数据位的和是否为偶数来判断数据的正确性。
奇偶校验码虽然简单易实现,但只能检测出奇数个错误位(例如一个错误的位),并不能检测出多个错误位或连续错误的情况。
因此,奇偶校验码一般用于对数据传输的基本错误进行检测。
2.循环冗余校验码(CRC):CRC是一种基于多项式除法的校验码校验算法,它通过对数据进行特定的多项式运算来计算出校验码。
接收方在收到数据后,也会对数据进行相同的多项式运算,然后比较计算出的校验码与发送方发送的校验码是否一致,从而判断数据是否正确。
CRC校验码具有较高的检错能力和容错率,能够有效地检测出多个位错误和定位错误的位置,因此广泛应用于计算机网络传输、磁盘存储、通信协议等领域。
3.校验和:校验和是一种简单的校验码校验算法,它通过对数据中所有位进行求和操作来计算出校验码。
接收方在接收到数据后,也会对数据进行相同的求和操作,然后比较计算出的校验和与发送方发送的校验和是否一致,从而判断数据是否正确。
校验和算法比较简单,计算速度较快,但只能检测出简单的错误情况,对于复杂的错误或多位错误检测能力有限。
数据传输中常用的差错检验技术

数据传输中常用的差错检验技术常用的差错检验技术是在数据传输过程中用来检测和纠正错误的方法。
这些技术被广泛应用于计算机网络和通信系统中,以确保数据的可靠性和完整性。
一、奇偶校验奇偶校验是一种简单的差错检验技术。
它通过在数据中添加一个奇偶位来检测错误。
在传输数据之前,发送方将数据中的所有位进行计数,并决定奇偶位的值,使得数据中1的个数是奇数或偶数。
接收方在接收到数据后,再次计算数据中1的个数,并与奇偶位的值进行比较。
如果两者不一致,则说明数据中存在错误。
二、循环冗余检验(CRC)循环冗余检验是一种更强大的差错检验技术。
它通过在数据中添加一个循环冗余码来检测错误。
发送方在传输数据之前,计算数据的循环冗余码,并将其附加在数据后面一起传输。
接收方在接收到数据后,再次计算数据的循环冗余码,并与接收到的冗余码进行比较。
如果两者一致,则说明数据传输没有出错。
三、海明码海明码是一种更高级的差错检验技术。
它通过在数据中添加冗余位来检测和纠正错误。
发送方在传输数据之前,根据数据的长度选择适当的海明码,并将其添加到数据中。
接收方在接收到数据后,通过检查冗余位的值来检测错误,并使用海明码的纠错能力来纠正错误。
四、前向纠错码(FEC)前向纠错码是一种能够检测和纠正错误的差错检验技术。
与传统的纠错码不同,前向纠错码在发送方将数据进行编码时就添加了冗余信息。
接收方在接收到数据后,通过检查冗余信息来检测和纠正错误。
前向纠错码具有较高的纠错能力,能够在传输过程中实时检测和纠正错误,从而提高数据传输的可靠性。
五、哈希校验哈希校验是一种通过哈希函数计算校验和来检测错误的差错检验技术。
发送方在传输数据之前,使用哈希函数计算数据的校验和,并将其附加在数据后面一起传输。
接收方在接收到数据后,再次使用哈希函数计算数据的校验和,并与接收到的校验和进行比较。
如果两者一致,则说明数据传输没有出错。
六、重发机制重发机制是一种在数据传输中常用的差错检验技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们知道,数字数据在其传输线路上会受到各种干扰的影响,有时候会产生误码,因此必须引入数据校验技术来验证数据传输的正确性和有效性。
目前,最为普通的两种校验技术就是循环冗余校验和奇偶校验技术。
下面将依次说明两种校验技术的原理。
奇偶校验在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。
奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。
接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。
注意,奇校验或偶校验由通信双方提前约定。
循环冗余校验奇偶校验码作为一种检错码虽然简单,但是漏检率太高。
在计算机网络和数据通信中用的最广泛的检错码,是一种漏检率低得多也便于实现的循环冗余码CRC (Cyclic Redundancy Code),CRC码又称为多项式码。
首先说明一个概念:生成多项式G(x),目前国际上生成多项式有下面几类标准:CRC-12码: G(x)=X12+X11+X3+X2+X+1(X后数字表示X的幂次,下同)CRC-16码: G(x)=X16+X15+X2+1CRC-CCITT码: G(x)=X16+X12+X5+1CRC-32码: G(x)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X+1 针对不同的数据传输类型(数据位不同,同步or异步传输)可选择不同的传输标准。
此外,不同国家也采用不同生成多项式标准。
下面先给两个个例子(纯数学运算),大家先体会一下运算过程:例1.已知:信息码:110011 信息多项式:K(X)=X5+X4+X+1生成码:11001 生成多项式:G(X)=X4+X3+1(r=4,表示冗余码位数)求:循环冗余码和码字。
解:1)(X5+X4+X+1)*X4的积是 X9+X8+X5+X4 对应的码是1100110000。
2)积/G(X)(按模二算法)。
1 00001←Q(X) (商)G(x)→1 1 0 0 1 )1 1 0 0 1 1 0 0 0 0←K(X)*Xr(“)”表示模二除号)1 1 0 0 110000011001 -1 0 0 1←R(X)(冗余码)由计算结果知冗余码是1001,码字就是1100111001(K(X)*Xr+R(x)对应码为待发送码字)。
例2.已知:接收码字:1100111001 多项式:T(X)=X9+X8+X5+X4+X3+1生成码: 11001 生成多项式:G(X)=X4+X3+1(r=4) 求:码字的正确性。
若正确,则指出冗余码和信息码。
解:1)用码字除以生成码,余数为0,所以码字正确。
1 0 0 0 0 1←Q(X)G(x)→1 1 0 0 1 )1 1 0 0 1 1 1 0 0 1←K(X)*Xr+R(x) (“)”表示模二除号)1 1 0 0 1 ,1 1 0 0 11 1 0 0 10←S(X)(余数)2)因r=4,所以冗余码是:1001,信息码是:110011总结CRC机理为(结合上述例子来理解):约定:二进制序列与多项式转换格式(X后数字为X的幂,如X0=1)例:X5+X3+X2+X1+ X0(X5+X3+X2+X1+ 1)对应的代码为101111)前提:给定待传输序列,给出冗余位数r, 并选定给定选择的生成多项式(其最高项Xr的系数恒为1),原理:CRC码在发送端编码和接收端校验时,都利用事先约定的生成多项式G(X)进行计算来得到。
k位要发送的信息位可对应于一个(k-1)次多项式K(X), r位冗余位则对应于一个(r-1)次多项式R(X),由k位信息位后面加上r位冗余位组成的 n="k"+r位码字则对应于一个(n-1)次多项式T(X)=Xr·K (X)+R(X)。
例如信息位:1011001→K(X)=X6+X4+X3+1冗余位:1010→R(X)=X3+X码字:10110011010→T(X)=X4·K(X)+R(X)=X10+X8+X7+X4+X3+X过程:1. 由信息位产生冗余位的编码(已知K(X)求R(X))Xr·K (X)%G(X)=R(X) (均为模2运算)2. T(X)=Xr·K(X)+R(X) (发送码)3.接受端若T(X)% G(X)=0 则传输正确4.通过其他算术运算实现:(1)可检测出所有奇数位错。
(2)可检测出所有双比特的错。
(3)可检测出所有小于、等于校验位长度的突发错。
附录:模二运算规则:0+0=0,0+1=1,1+0=1,1+1=00-0=0,0-1=1,1-0=1,1-1=0在进行基于模2运算的多项式除法时,只要部分余数首位为1,便可上商1,否则上商0。
然后按模2减法求得余数,该余数不计最高位。
当被除数逐位除完时,最后得到比除数少一位的余数。
奇偶,海明,CRC校验码计算机系统运行时,各个部之间要进行数据交换.为确保数据在传送过程正确无误,常使用检验码.我们常使用的检验码有三种.分别是奇偶校验码,海明校验码和循环冗余校验码(CRC)奇偶校验码最简单,但只能检测出奇数位出错.如果发生偶数位错误就无法检测.但经研究是奇数位发生错误的概率大很多.而且奇偶校验码无法检测出哪位出错.所以属于无法矫正错误的校验码而其他两种可以.下面按顺序介绍这几种校验码.奇偶校验码是奇校验码和偶校验码的统称.它们都是通过在要校验的编码上加一位校验位组成.如果是奇校验加上校验位后,编码中1的个数为奇数个如果是偶校验加上校验位后,编码中1的个数为偶数个例:原编码奇校验偶校验0000 0000 1 0000 00010 0010 0 0010 11100 1100 1 1100 01010 1010 1 1010 0如果发生奇数个位传输出错,那么编码中1的个数就会发生变化.从而校验出错误. 要求从新传输数据.目前应用的奇偶校验码有3种.水平奇偶校验码对每一个数据的编码添加校验位,使信息位与校验位处于同一行.垂直奇偶校验码把数据分成若干组,一组数据排成一行,再加一行校验码.针对每一行列采用奇校验或偶校验例: 有32位数据10100101 00110110 11001100 10101011垂直奇校验垂直偶校验数据10100101 1010010100110110 0011011011001100 1100110010101011 10101011校验为00001011 11110100水平垂直奇偶校验码就是同时用水平校验和垂直校验例:奇校验奇水平偶校验偶水平数据10100101 1 10100101 000110110 1 00110110 011001100 1 11001100 010101011 0 10101011 1校验00001011 0 11110100 1然后是海明校验码海明码也是利用奇偶性来校验数据的.它是一种多重奇偶校验检错系统,它通过在数据位之间插入k个校验位,来扩大码距,从而实现检错和纠错.设原来数据有n位,要加入k位校验码.怎么确定k的大小呢?k个校验位可以有pow(2,k) (代表2的k次方) 个编码,其中有一个代表是否出错.剩下pow(2,k)-1个编码则用来表示到底是哪一位出错.因为n个数据位和k个校验位都可能出错所以k满足pow(2,k)-1 >= n+k设k个校验码为P1,P2...Pk, n个数据位为D0,D1...Dn产生的海明码为H1,H2...H(n+k)Pi放在海明码的pow(2,i-1)个位置上.如有8个数据位,根据pow(2,k)-1 >= n+k可以知道k最小是4 那么得到的海明码是H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1D7 D6 D5 D4 P4 D3 D2 D1 P3 D0 P2 P1然后怎么知道Pi校验哪个位呢.自己可以列个校验关系表海明码下标校验位组H1(P1) 1 P1H2(P2) 2 P2H3(D0) 1+2 P1,P2H4(P3) 4 P3H5(D1) 1+4 P1,P2H6(D2) 2+4 P2,P3H7(D3) 1+2+4 P1,P2,P3H8(P4) 8 P4H9(D4) 1+8 P1,P4H10(D5) 2+8 P2,P4H11(D6) 1+2+8 P1,P2,P4H12(D7) 4+8 P3,P4从表中可以看出P1校验P1,D0,D1,D3,D4,D6P2校验P2,D0,D2,D3,D5,D6P3校验P3,D1,D2,D3,D7P4校验P4,D4,D5,D6,D7其实上表很有规律很容易记要知道海明码Hi由哪些校验组校验可以把i化成二进制数数中哪些位k是1,就有哪些Pk校验如H7 7=0111 所以由P1,P2,P3H11 11=1011 所以由P1,P2,P4H3 3=0011 所以由P1,P2那看看Pi的值怎么确定如果使用偶校验,则P1=D0 xor D1 xor D3 xor D4 xor D6P2=D0 xor D2 xor D3 xor D5 xor D6P3=D1 xor D2 xor D3 xor D7P4=D4 xor D5 xor D6 xor D7其中xor是异或运算奇校验的话把偶校验的值取反即可.那怎么校验错误呢.其实也很简单. 先做下面运算.G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6G2 = P2 xor D0 xor D2 xor D3 xor D5 xor D6G3 = P3 xor D1 xor D2 xor D3 xor D7G4 = P4 xor D4 xor D5 xor D6 xor D7如果用偶校验那么G4G3G2G1 全为0是表示无错误(奇校验全为1) 当不全为0表示有错G4G3G2G1 的十进制值代表出错的位.如G4G3G2G1 =1010 表示H10(D5)出错了.把它求反就可以纠正错误了.下面举一个比较完全的例子:设数据为01101001,试用4个校验位求其偶校验方式的海明码.传输后数据为011101001101,是否有错?P1=D0 xor D1 xor D3 xor D4 xor D6=1 xor 0 xor 1 xor 0 xor 1=1P2=D0 xor D2 xor D3 xor D5 xor D6=1 xor 0 xor 1 xor 1 xor 1=0P3=D1 xor D2 xor D3 xor D7=0 xor 0 xor 1 xor 0=1P4=D4 xor D5 xor D6 xor D7=0 xor 1 xor 1 xor 0=0所以得到的海明码为0 1 1 0 0 1 0 0 1 1 0 1传输后为011101001101G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6=1G2 = P2 xor D0 xor D2 xor D3 xor D5 xor D6=0G3 = P3 xor D1 xor D2 xor D3 xor D7=0G4 = P4 xor D4 xor D5 xor D6 xor D7=1所以1001代表9即H9出错了,对它求反011001001101 和我们算的一样.由此可见海明码不但有检错还有纠错能力下面说下最后一种CRC即循环冗余校验码CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称(n,k)码.CRC码广泛应用于数据通信领域和磁介质存储系统中.CRC理论非常复杂,一般书就给个例题,讲讲方法.现在简单介绍下它的原理:在k位信息码后接r位校验码,对于一个给定的(n,k)码可以证明(数学高手自己琢磨证明过程)存在一个最高次幂为n-k=r 的多项式g(x)根据g(x)可以生成k位信息的校验码,g(x)被称为生成多项式用C(x)=C(k-1)C(k-2)...C0表示k个信息位把C(x)左移r位,就是相当于C(x)*pow(2,r)给校验位空出r个位来了.给定一个生成多项式g(x),可以求出一个校验位表达式r(x)C(x)*pow(2,r) / g(x) = q(x) + r(x)/g(x)用C(x)*pow(2,r)去除生成多项式g(x)商为q(x)余数是r(x)所以有C(x)*pow(2,r) = q(x)*g(x) + r(x)在CRC运算过程中,四则运算采用mod 2运算(后面介绍),即不考虑进位和借位.所以上式等价于C(x)*pow(2,r) + r(x) = q(x)*g(x)C(x)*pow(2,r) + r(x)就是所求的n位CRC码,由上式可以看出它是生成多项式g(x)的倍式.所以如果用得到的n位CRC码去除g(x)如果余数是0,就证明数据正确.否则可以根据余数知道出错位.继续前先说下基本概念吧.1.多项式和二进制编码x的最高次幂位对应二进制数的最高位.以下各位对应多项式的各幂次.有此幂次项为1,无为0. x的最高幂次为r时, 对应的二进制数有r+1位例如g(x)=pow(x,4) + pow(x,3) + x + 1对应二进制编码是110112.生成多项式是发送方和接受方的一个约定,也是一个二进制数,在整个传输过程中,这个数不会变. 在发送方,利用生成多项式对信息多项式做模2运算生成校验码.在接受方利用生成多项式对收到的编码多项式做模2运算校验和纠错.生成多项式应满足:a.生成多项式的最高位和最低位必须为1b.当信息任何一位发生错误时,被生成多项式模2运算后应该使余数不为0c.不同位发生错误时,应该使余数不同.d.对余数继续做模2除,应使余数循环.生成多项式很复杂不过不用我们生成下面给出一些常用的生成多项式表n k 二进制码(自己根据多项式和二进制编码的介绍转)7 4 1011 或11017 3 11011 或1011115 11 101131 26 1001013.模2运算a.加减法法则0 +/- 0 = 00 +/- 1 = 11 +/- 0 = 11 +/- 1 = 0注意:没有进位和借位b.乘法法则利用模2加求部分积之和,没有进位c.除法法则利用模2减求部分余数没有借位每商1位则部分余数减1位余数最高位是1就商1,不是就商0当部分余数的位数小于余数时,该余数就是最后余数.例11101011)1100000101111101011101010110010(每商1位则部分余数减1位,所以前两个0写出)0000010(当部分余数的位数小于余数时,该余数就是最后余数)最后商是1110余数是010好了说了那么多没用的理论.下面讲下CRC的实际应用例: 给定的生成多项式g(x)=1011, 用(7,4)CRC码对C(x)=1010进行编码. 由题目可以知道下列的信息:C(x)=1010,n=7,k=4,r=3,g(x)=1011C(x)*pow(2,3)=1010000C(x)*pow(2,3) / g(x) = 1001 + 011/1011所以r(x)=011所以要求的编码为1010011例2: 上题中,数据传输后变为1000011,试用纠错机制纠错.1000011 / g(x) = 1011 + 110/1011不能整除,所以出错了. 因为余数是110查1011出错位表可以知道是第5位出错.对其求反即可.。