常用校验码
- 格式:doc
- 大小:36.50 KB
- 文档页数:5
校验码的基础知识校验码是计算机科学中一种常见的错误检测和纠正方法,用于确保数据的完整性和准确性。
在数据传输和存储过程中,校验码可以帮助检测和纠正可能存在的错误,从而提高数据的可靠性。
本文将介绍校验码的基础知识,包括校验码的定义、常见的校验码类型以及其应用领域。
一、校验码的定义校验码是一种用于检测和纠正数据传输或存储过程中产生的错误的技术。
它通过对数据进行特定的计算,生成一个额外的数据,用于检测数据中的错误。
校验码通常附加在数据的末尾,接收方在接收到数据后可以通过计算校验码来验证数据的完整性和准确性。
二、常见的校验码类型1. 奇偶校验码:奇偶校验码是最简单的一种校验码。
它通过统计数据中二进制位中1的个数,来判断数据的奇偶性。
如果数据中1的个数为偶数,校验码位为0;如果数据中1的个数为奇数,校验码位为1。
接收方在接收到数据后,再次计算数据中1的个数,与接收到的校验码进行比较,如果不一致,则说明数据存在错误。
2. 循环冗余校验码(CRC):CRC是一种常用的校验码类型。
它通过对数据进行多项式除法运算,生成一个余数作为校验码。
接收方在接收到数据后,进行相同的多项式除法运算,将得到的余数与发送方传输的校验码进行比较,如果一致,则说明数据未发生错误。
3. 校验和:校验和是一种简单的校验码类型。
它通过对数据中每个字节进行相加,并取结果的低字节作为校验码。
接收方在接收到数据后,进行相同的相加操作,并将结果的低字节与发送方传输的校验码进行比较,如果一致,则说明数据未发生错误。
三、校验码的应用领域校验码广泛应用于数据通信和数据存储领域。
以下是一些常见的应用场景:1. 网络通信:在网络通信中,校验码可以用于检测和纠正数据传输过程中可能存在的错误。
例如,在传输文件时,发送方可以计算文件的校验码并发送给接收方,接收方在接收到文件后可以通过计算文件的校验码来验证文件的完整性。
2. 数据存储:在数据存储中,校验码可以用于检测和纠正存储介质中的错误。
1. CRC码的概念CRC(Cyclic Redundancy Check)码是一种错误检测码,用于在数字通信中检测数据传输过程中的错误。
它是通过对数据进行多项式除法运算来计算校验位,以便在接收端检测出数据传输中是否发生了错误。
2. 5G通信系统中的CRC码作用在5G通信系统中,CRC码被用于对数据进行检错校验,以保证数据传输的可靠性和正确性。
由于5G通信系统对数据传输的要求更加严格,因此CRC码在其中扮演着非常重要的角色。
3. 5G通信系统中所用到的CRC码种类在5G通信系统中,常用的CRC码种类包括:3.1 CRC-8:采用8位多项式进行计算,用于对较短的数据进行检错校验。
3.2 CRC-16:采用16位多项式进行计算,用于对中等长度的数据进行检错校验。
3.3 CRC-24:采用24位多项式进行计算,用于对较长的数据进行检错校验。
3.4 CRC-32:采用32位多项式进行计算,用于对较长的数据进行检错校验。
4. 5G通信系统中CRC码的计算方法在5G通信系统中,CRC码的计算方法通常采用多项式除法运算。
具体步骤为:4.1 将数据按照多项式格式表示,即将数据转换为二进制形式,并在末尾添加与CRC码位数相同的0。
4.2 以CRC多项式作为除数,对扩充后的数据进行多项式除法运算,得到余数作为校验码。
4.3 将校验码附加到原始数据后面,得到最终的发送数据。
5. 5G通信系统中CRC码的校验方法在5G通信系统中,CRC码的校验方法也采用多项式除法运算。
具体步骤为:5.1 将接收到的数据按照多项式格式表示,并去除最后附加的校验码。
5.2 以CRC多项式作为除数,对接收到的数据进行多项式除法运算,得到余数。
5.3 检查余数是否为全0,若不是则说明数据传输中发生了错误。
6. 5G通信系统中CRC码的性能优化在5G通信系统中,为了提高传输效率和减少错误率,常常会对CRC码进行性能优化。
这包括选择合适的多项式,采用硬件加速和并行计算等技术来加快CRC码的计算速度和提高准确性。
3.2差错控制3.2.2常用的检错码- 奇偶校验码奇偶校验码是一种简单的检错码,奇偶校验码分为奇校验码和偶校验码,两者原理相同。
它通过增加冗余位来使得码字中“1”的个数保持奇数或偶数。
•无论是奇校验码还是偶校验码,其监督位只有一位;•假设信息为为I1, I2, …, I n,对于偶校验码,校验位R可以表示为:R =I1 ⊕I2⊕Λ⊕In•假设信息为为I1, I2, …, I n,对于奇校验码,校验位R可以表示为:R =I1 ⊕I2⊕Λ⊕In⊕1•无论是奇校验码还是偶校验码,都只能检测出奇数个错码,而不能检测偶数个错码。
44讨论: 从检错能力、编码效率和代价等方面来评价垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验3.2 差错控制3.2.2 常用的检错码 - 奇偶校验码 奇偶校验在实际使用时又可分为垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验等几种。
53.2.2常用的检错码–定比码所谓定比码,即每个码字中“1”的个数与“0”的个数之比保持恒定,故又名等比码或恒比码。
•当码字长一定,每个码字所含“1”的数目都相同,“0”的数目也都相同。
•由于若n位码字中“1”的个数恒定为m,还可称为“n中取m”码定比码(n中取m)的编码效率为:log C mR = 2 nn定比码能检测出全部奇数位错以及部分偶数位错。
实际上,除了码字中“1”变成“0”和“0”变成“1”成对出现的差错外,所有其它差错都能被检测出来64代码“1011011”对应的多项式为x 6 + x 4 + x 3 +1多项式“x 5 + x 4 + x 2 + x”所对应的代码为“110110” 3.2.2 常用的检错码 – 循环冗余检验 循环冗余码(Cyclic Redundancy Code ,简称CRC )是无线通信中用得最广泛的检错码,又被称为多项式码。
二进制序列多项式:任何一个由m 个二进制位组成的代码序列都可以和一个只含有0和1两个系数的m-1阶多项式建立一一对应的关系。
CRC校验码计算详解CRC(Cyclic Redundancy Check)是一种常用的错误检测码,被广泛应用于通信、数据存储等领域。
它通过在数据传输过程中添加一些冗余的校验位,在接收端对接收到的数据进行校验,判断数据是否发生了错误或者变化。
在CRC校验码计算中,最关键的是选择合适的生成多项式。
生成多项式生成多项式是CRC中很重要的一个参数,决定了校验码的长度和性能。
常见的生成多项式有CRC-16、CRC-32等,其中CRC-32具有较高的错误检测能力。
生成多项式可以通过数学计算的方式进行选择,常见的生成多项式如下:-CRC-8:x^8+x^2+x+1-CRC-16:x^16+x^15+x^2+1-CRC-32:x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1计算CRC校验码的步骤1.选择生成多项式。
根据需要选择合适的生成多项式,如CRC-322.初始化寄存器。
将寄存器设置为全0。
3.将要传输的数据添加到帧尾部。
在原始数据的末尾添加一个确定长度的校验位,通常为生成多项式的位数-14.逐位计算校验码。
从最高位开始,对每一位数据进行处理。
-如果当前位为1,则将寄存器的最高位与生成多项式进行异或操作。
-将寄存器向右移动一位,丢弃最低位。
5.重复第4步,直到所有数据都被处理完。
6.返回校验码。
将寄存器的内容作为校验码。
验证CRC校验码的步骤在接收端,可以使用相同的生成多项式和计算过程对接收到的数据进行校验,判断其是否发生了错误或者变化。
1.初始化寄存器。
将寄存器设置为全0。
2.将接收到的数据添加到寄存器。
3.逐位计算校验码。
从最高位开始,对每一位数据进行处理。
处理过程与计算CRC校验码的步骤相同。
4.判断校验码。
如果最终寄存器的值与接收到的校验码一致,则数据未发生错误或者变化,否则说明数据发生错误或者变化。
1.算法简单。
CRC校验码的计算过程非常简单,可以很容易地实现。
常见校验算法一、校验算法奇偶校验MD5校验求校验和BCC(Block Check Character/信息组校验码),好像也是常说的异或校验方法CRC(Cyclic Redundancy Check/循环冗余校验)LRC(Longitudinal Redundancy Check/纵向冗余校验)二、奇偶校验内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。
不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。
而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。
在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。
当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。
从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误三、MD5校验MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc 发明,由MD2/MD3/MD4 发展而来的。
MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被“篡改”。
举个例子,天天安全网提供下载的MD5校验值软件WinMD5.zip,其MD5值是1e07ab3591d25583eff5129293dc98d2,但你下载该软件后计算MD5 发现其值却是81395f50b94bb4891a4ce4ffb6ccf64b,那说明该ZIP已经被他人修改过,那还用不用该软件那你可自己琢磨着看啦。
常用校验码(奇偶校验码、海明校验码、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。
CRC校验码的原理CRC(Cyclic Redundancy Check)是一种常用的校验码,用于检测数据传输中的错误。
CRC校验码的原理是通过对数据进行计算,生成一个校验码,并将其附加到原始数据中一起传输。
接收方在收到数据后,通过重新计算校验码,并将其与接收到的校验码进行比较,以判断数据是否发生了错误。
1.选择一个固定长度的除数,通常称为生成多项式。
2.将生成多项式左移一个比特位,然后与数据的首个比特位进行“异或”操作。
结果称为“临时商”。
3.将数据向左移动一个比特位,并将上一步计算得到的临时商与下一个比特位进行“异或”操作,生成新的临时商。
4.重复上述过程,直到处理完数据的所有比特位。
5.将计算得到的临时商添加到原始数据的末尾作为校验码。
接收方收到数据后也按照相同的生成多项式重新进行CRC计算,然后将计算得到的临时商与接收到的校验码进行比较。
如果两者相等,说明数据没有发生错误;如果不相等,说明数据发生了错误。
在这种情况下,接收方可以要求发送方重新发送数据。
1.高效性:CRC校验码通常能够检测出大多数单比特和多比特的错误,很少漏掉错误。
2.易于实现:CRC校验码的计算过程可以通过硬件电路或软件算法来实现,非常简单直观。
3.不可逆性:CRC校验码不能完全确定数据中的错误位置和错误数量,而仅能检测错误。
4.灵活性:可以根据需要选择不同的生成多项式,以适应不同的数据传输环境。
需要注意的是,CRC校验码并不能检测所有的错误,特别是在数据传输距离较长、传输介质质量较差或噪声较多的情况下,仍然可能发生传输错误。
因此,在实际应用中,需要根据具体情况选择合适的校验码和纠错方法来保证数据传输的可靠性。
常用的检错码-奇偶校验码3.2差错控制3.2.2常用的检错码- 奇偶校验码奇偶校验码是一种简单的检错码,奇偶校验码分为奇校验码和偶校验码,两者原理相同。
它通过增加冗余位来使得码字中“1”的个数保持奇数或偶数。
无论是奇校验码还是偶校验码,其监督位只有一位;假设信息为为I1, I2, …, I n,对于偶校验码,校验位R可以表示为:R =I1 ⊕I2⊕Λ⊕In假设信息为为I1, I2, …, I n,对于奇校验码,校验位R可以表示为:R =I1 ⊕I2⊕Λ⊕In⊕1无论是奇校验码还是偶校验码,都只能检测出奇数个错码,而不能检测偶数个错码。
44讨论:从检错能力、编码效率和代价等方面来评价垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验3.2 差错控制3.2.2 常用的检错码 - 奇偶校验码奇偶校验在实际使用时又可分为垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验等几种。
53.2.2常用的检错码–定比码所谓定比码,即每个码字中“1”的个数与“0”的个数之比保持恒定,故又名等比码或恒比码。
当码字长一定,每个码字所含“1”的数目都相同,“0”的数目也都相同。
由于若n位码字中“1”的个数恒定为m,还可称为“n中取m”码定比码(n中取m)的编码效率为:log C mR = ?2 nn定比码能检测出全部奇数位错以及部分偶数位错。
实际上,除了码字中“1”变成“0”和“0”变成“1”成对出现的差错外,所有其它差错都能被检测出来64代码“1011011”对应的多项式为x 6 + x 4 + x 3 +1多项式“x 5 + x 4 + x 2 + x”所对应的代码为“110110” 3.2.2 常用的检错码–循环冗余检验循环冗余码(Cyclic Redundancy Code ,简称CRC )是无线通信中用得最广泛的检错码,又被称为多项式码。
二进制序列多项式:任何一个由m 个二进制位组成的代码序列都可以和一个只含有0和1两个系数的m-1阶多项式建立一一对应的关系。
校验原理1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+g R x R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC 码字。
4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001x4m(x)=x10+x8+x7+x4对应的代码记为:10110010000;采用多项式除法: 得余数为: 1010 (即校验字段为:1010)发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,CRC校验源码分析这两天做项目,需要用到CRC 校验。
以前没搞过这东东,以为挺简单的。
结果看看别人提供的汇编源程序,居然看不懂。
花了两天时间研究了一下CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省点时间。
先是在网上下了一堆乱七八遭的资料下来,感觉都是一个模样,全都是从CRC 的数学原理开始,一长串的表达式看的我头晕。
校验码的计算方法
一、校验码的基本概念
校验码作为信息的一部分,用来对数据在传送、存储过程中的完整性进行检查,用于检测出数据正确性,也可用于发现出数据在传输过程中的错误。
它是常用的信息认证技术,其目的是通过用位等方式通过算术或逻辑函数及其他运算,由发送端计算出一个校验码,传输给接收端,由接收端重新计算,与发送端传输的校验码进行比较,从而验证发送和接收的准确性。
二、常用校验码计算方法
1.奇偶校验码:
奇偶校验码是将发送的数据按位进行XOR运算,最终计算出一个校验码。
其计算方法如下:首先令n为要发送的数据的位数,即有n个位,每一位记为d(0),d(1),d(2),……,d(n-1);将它们看成二进制数,将它们相加,即可得出最后的校验码C=
d(0)⊕d(1)⊕d(2)⊕……⊕d(n-1)。
2.CRC校验码:
CRC(全称循环冗余校验码),它是一种比较高效的数据校验技术,其校验效果很好,强度高,可检测出多重错误,用于检测经过网络或外界媒介传输的软件或文件中的错误。
CRC校验码的计算方式如下:首先,将原始数据分成以位为单位的、等长的字节块,每一段连续的字节块称为一个字。
常用校验码(奇偶校验码、海明校验码、CRC校验码)
计算机系统运行时,各个部之间要进行数据交换. 为确保数据在传送过程正确无误,常使用检验码. 我们常使用的检验码有三种. 分别是奇偶校验码、海明校验码和循环冗余校验码(CRC)。
奇偶校验码
奇偶校验码最简单,但只能检测出奇数位出错. 如果发生偶数位错误就无法检测. 但经研究是奇数位发生错误的概率大很多. 而且奇偶校验码无法检测出哪位出错.所以属于无法矫正错误的校验码。
奇偶校验码是奇校验码和偶校验码的统称. 它们都是通过在要校验的编码上加一位校验位组成. 如果是奇校验加上校验位后,编码中1的个数为奇数个。
如果是偶校验加上校验位后,编码中1的个数为偶数个。
例:
原编码奇校验偶校验
0000 0000 1 0000 0
0010 0010 0 0010 1
1100 1100 1 1100 0
1010 1010 1 1010 0
如果发生奇数个位传输出错,那么编码中1的个数就会发生变化. 从而校验出错误,要求从新传输数据。
目前应用的奇偶校验码有3种.
水平奇偶校验码对每一个数据的编码添加校验位,使信息位与校验位处于同一行.
垂直奇偶校验码把数据分成若干组,一组数据排成一行,再加一行校验码. 针对每一行列采用奇校验或偶校验
例: 有32位数据10100101 00110110 11001100 10101011
垂直奇校验垂直偶校验
数据10100101 10100101
00110110 00110110
11001100 11001100
10101011 10101011
校验00001011 11110100
水平垂直奇偶校验码就是同时用水平校验和垂直校验
例:
奇校验奇水平偶校验偶水平
数据 10100101 1 10100101 0
00110110 1 00110110 0
11001100 1 11001100 0
10101011 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) 。
如有8个数据位,根据pow(2,k)-1 >= n+k可以知道k最小是4。
那么得到的海明码是:
H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
D7 D6 D5 D4 P4 D3 D2 D1 P3 D0 P2 P1
然后怎么知道Pi校验哪个位呢. 自己可以列个校验关系表
海明码下标校验位组
H1(P1) 1 P1
H2(P2) 2 P2
H3(D0) 1+2 P1,P2
H4(P3) 4 P3
H5(D1) 1+4 P1,P2
H6(D2) 2+4 P2,P3
H7(D3) 1+2+4 P1,P2,P3
H8(P4) 8 P4
H9(D4) 1+8 P1,P4
H10(D5) 2+8 P2,P4
H11(D6) 1+2+8 P1,P2,P4
H12(D7) 4+8 P3,P4
从表中可以看出
P1校验 P1,D0,D1,D3,D4,D6
P2校验 P2,D0,D1,D2,D3,D5,D6
P3校验 P3,D2,D3,D7
P4校验 P4,D4,D5,D6,D7
其实上表很有规律很容易记,要知道海明码Hi由哪些校验组校验,可以把i化成二进制数数中哪些位k 是1,就有哪些Pk校验
如H7 7=0111 所以由P1,P2,P3 H11 11=1011 所以由P1,P2,P4 H3 3=0011 所以由P1,P2
那看看Pi的值怎么确定,如果使用偶校验,则
P1=D0 xor D1 xor D3 xor D4 xor D6
P2=D0 xor D1 xor D2 xor D3 xor D5 xor D6
P3=D1 xor D2 xor D3 xor D7
P4=D4 xor D5 xor D6 xor D7
其中xor是异或运算,奇校验的话把偶校验的值取反即可.那怎么校验错误呢. 其实也很简单. 先做下面运算.
G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6
G2 = P2 xor D0 xor D1 xor D2 xor D3 xor D5 xor D6
G3 = P3 xor D1 xor D2 xor D3 xor D7
G4 = P4 xor D4 xor D5 xor D6 xor D7
循环冗余校验码
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)
C(x)*pow(2,r) + r(x)就是所求的n位CRC码,由上式可以看出它是生成多项式g(x)的倍式.所以如果用得到的n位CRC码去除g(x)如果余数是0,就证明数据正确. 否则可以根据余数知道出错位.
在CRC运算过程中,四则运算采用 mod 2运算(后面介绍),即不考虑进位和借位.所以上式等价于
C(x)*pow(2,r) + r(x) = q(x)*g(x)
继续前先说下基本概念吧.
1.多项式和二进制编码
x的最高次幂位对应二进制数的最高位.以下各位对应多项式的各幂次. 有此幂次项为1,无为0. x的最高幂次为r时, 对应的二进制数有r+1位例如g(x)=pow(x,4) + pow(x,3) + x + 1 对应二进制编码是 11011
2.生成多项式是发送方和接受方的一个约定,也是一个二进制数,在整个传输过程中,这个数不会变.
在发送方利用生成多项式对信息多项式做模2运算生成校验码.
在接受方利用生成多项式对收到的编码多项式做模2运算校验和纠错.
生成多项式应满足:
a.生成多项式的最高位和最低位必须为1
b.当信息任何一位发生错误时,被生成多项式模2运算后应该使余数不为0
c.不同位发生错误时,应该使余数不同.
d.对余数继续做模2除,应使余数循环.
生成多项式很复杂,不过不用我们生成。
下面给出一些常用的生成多项式表
n k 二进制码(自己根据多项式和二进制编码的介绍转)
7 4 1011 或 1101
7 3 11011 或 10111
15 11 1011
31 26 100101
3.模2运算
a.加减法法则
0 +/- 0 = 0
0 +/- 1 = 1
1 +/- 0 = 1
1 +/- 1 = 0
注意:没有进位和借位
b.乘法法则
利用模2加求部分积之和,没有进位
c.除法法则
利用模2减求部分余数,没有借位,每商1位则部分余数减1位,余数最高位是1就商1,不是就商0,当部分余数的位数小于余数时,该余数就是最后余数.
例 1110
1011)1100000
1011
1110
1011
1010
1011
0010(每商1位则部分余数减1位,所以前两个0写出)
0000
010(当部分余数的位数小于余数时,该余数就是最后余数)
最后商是1110余数是010
好了说了那么多没用的理论.下面讲下CRC的实际应用.例: 给定的生成多项式g(x)=1011, 用(7,4)CRC码对C(x)=1010进行编码.
由题目可以知道下列的信息:
C(x)=1010,n=7,k=4,r=3,g(x)=1011 C(x)*pow(2,3)=1010000 C(x)*pow(2,3) / g(x) = 1001 + 11/1011 所以r(x)=011.所以要求的编码为1010011
例2: 上题中,数据传输后变为1000011,试用纠错机制纠错. 1000011 / g(x) = 1011 + 110/1011
不能整除,所以出错了. 因为余数是110.查1011出错位表可以知道是第5位出错.对其求反即可.。