CRC校验算法学习
CRC校验算法学习
CRC校验算法学习CRC(Cyclic Redundancy Check)校验算法是一种常用的数据传输错误检测算法,通过采用二进制多项式除法进行计算,能够高效地检测出传输过程中出现的错误。
1.需要进行校验的数据被看作是一个二进制数,以位序从高到低排列。
2.被检测的数据被除以一个预先选定的标准除数(也称为生成多项式),生成的余数被附加到原始数据后面,形成一个新的数据。
3.发送方将新的数据传输给接收方。
4.接收方接到数据后,进行同样的除法运算,如果所得的余数为0,说明传输过程中没有出现错误;如果余数不为0,说明传输过程中出现了错误。
1.算法简单,实现方便。
2.高效地检测出错误,能够探测到大多数单比特错、双比特错和比特异或错。
1.确定生成多项式G,以二进制形式表示。
生成多项式的最高次幂为n,其最低项系数为1,其他项的系数可以为0或1、G的位数为n+12.将待发送的数据D转换为二进制形式,并在其最高位前面补n个0,得到扩展后的数据M。
3.计算M除以G的余数,即CRC值,记为R。
4.在待发送的数据D的末尾添加余数R,得到带有CRC校验码的数据T,将T发送给接收方。
5.接收方接收到数据T后,将数据与G进行除法运算,计算得到余数R'。
6.如果R'等于0,则说明数据传输没有发生错误;如果R'不等于0,则说明发生了错误。
除了基本的CRC校验算法,还存在许多衍生的CRC算法,如CRC-8、CRC-16和CRC-32等。
这些算法在生成多项式和数据处理方式上有所不同,适用于不同的应用场景。
总结来说,CRC校验算法是一种用于数据传输错误检测的算法,通过二进制多项式除法进行计算,能够高效地检测出传输过程中出现的错误。
它具有算法简单、高效检测错误等优势,并且在各种领域有广泛应用。
crc校验详解
CRC校验专题以CRC-16为例,说明CRC的计算过程:1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。
此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
翻译:1.意思是首先寄存器中的值是11111111111111112.数据第一个字节一个字节=8位用二进制表示就是【00000000-11111111】之间用这个数值跟寄存器中的16个1中的后8位进行异或(异或不知道什么意思的自己查简单理解就是同为0 异为1)然后把这个数值保存到寄存器中3.判断最后一位是否为0 如果为0寄存器中的值向右移动一位前面补零如果为1 拿寄存器中的值与多项式进行异或。
4.检查当前寄存器中的最后一位如果是0 重复第三步;如果是寄存器中的值与多项式进行异或5.重复3与4直到8此移位完成。
6.重复第2到第五步知道正规数组的数据验证完成7.最终计算出的就是CRC的值实例:实例byte[] bufs=new byte[]{0x2f,0x12,0x31} crc16 多项式码假设是0x8408 二进制形式就是10000100000010001crc=0xffff; 用二进制表示就是11111111111111112拿出bufs中第一个字节0x2f 二进制表示00101111 跟寄存器中的后8位进行异或得到11111111110100003判断CRC寄存器中最后一位当前为0 寄存器右移一位得到0111111111101000 (如果为1就与多项式进行异或)4判断当前寄存器中的值当前最后一位为0 所以重复第三步继续右移得到0011111111110100 最后还是0 在重复第三步0001111111111010 最后还是0 继续第三步0000111111111101 这时最后一位为1了这时与多项式进行异或得到10111011111110015重复判断知道判断完8次6然后再重复第2到第5步直到上面数组中的bufs中三个字节验证完7最终寄存器中的值就是crc值下面进行实战C# code 分析const uint PRESET_VALUE = 0xFFFF; 初始化寄存器的值const uint POLYNOMIAL = 0x8408; 多项式码三个参数 1char数组 byte一样 2.数组长度uint uiCrc16Cal(char[] pucY, int ucX){uint ucI, ucJ;uint uiCrcValue = PRESET_VALUE; 赋除值for(ucI = 0; ucI < ucX; ucI++){uiCrcValue = uiCrcValue ^ pucY[ucI]; 进行异或for(ucJ = 0; ucJ < 8; ucJ++) 由于一个字节 8位所以判段8次{if((uiCrcValue & 0x0001) != 0) (*1下面解释){uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;} (*2下面解释)else{uiCrcValue = (uiCrcValue >> 1);} (*3下面解释)}}return uiCrcValue;}*1 “&”这个符号在C 、C#等语言上是按位与即按二进制比对1与1 得1 0与1得0 0与0得0 例如:比如:10010001(二进制)&11110000等于10010000(二进制)。
CRC校验算法详解及代码实现
CRC校验算法详解及代码实现CRC校验算法的原理是利用生成多项式来计算数据的校验值。
在发送端,将数据和生成多项式进行计算得到一个校验值,然后将这个校验值附加到发送的数据后面一起传输。
在接收端,接收到数据后再次进行计算,并与接收到的校验值进行比较,如果相同则说明数据传输过程中没有错误,否则说明数据传输过程中出现错误。
下面是CRC校验算法的具体步骤:1.选择一个生成多项式,通常用一个二进制数表示。
生成多项式的位数称为CRC位数,常见的有CRC-8,CRC-16,CRC-32等。
2.将生成多项式的最高位与数据的最高位对齐,然后进行异或运算。
异或运算的结果作为下一次异或运算的输入,直到将所有数据都计算完毕。
3.将计算得到的结果作为校验值附加到数据后面一起传输。
下面是一个简单的CRC校验算法的代码实现:```pythondef crc(data, generator):crc_value = 0generator_length = len(generator)for bit in data:crc_value ^= bitif crc_value & 0x1:crc_value = (crc_value >> 1) ^ int(generator, 2)else:crc_value = crc_value >> 1return crc_value#测试数据data = [1, 0, 1, 1]generator = "1011"#进行CRC校验residue = crc(data, generator)print(residue)```在上面的代码中,`data`表示要进行校验的数据,以列表的形式表示,每个元素是一个二进制位。
`generator`表示生成多项式,以字符串的形式表示,每个字符是一个二进制位。
程序输出的结果为校验值。
总结:本文详细介绍了CRC校验算法的原理和步骤,并给出了一个简单的代码实现。
crc检验计算方法
crc检验计算方法1.1 CRC是什么?CRC啊,就是循环冗余校验(Cyclic Redundancy Check)的简称。
这就好比是给数据加了一道安全锁,是一种非常重要的数据校验方法呢。
它就像一个细心的小管家,在数据传输或者存储的时候,检查数据有没有出错。
1.2 原理像拼图。
它的原理有点像拼图。
发送端根据数据按照特定的算法算出一个校验值,这个校验值就像是拼图的最后一块。
接收端呢,收到数据后也用同样的算法计算校验值,如果两边算出来的一样,那就说明数据大概率是完整准确的,就像拼图完整地拼好了。
要是不一样,那数据可能就出问题了,就像拼图缺了一块或者有块拼错了。
二、具体的计算步骤。
2.1 选择生成多项式。
这生成多项式啊,就像是一把特殊的尺子。
不同的应用场景会选择不同的生成多项式。
比如说在一些简单的通信里,可能会选择比较简单的多项式,就像做小手工选择简单的工具一样。
这个多项式的系数通常用二进制表示,它决定了校验的规则。
2.2 数据处理。
要把原始数据后面补上若干个0,补0的个数和生成多项式的阶数有关。
这就像是给原始数据后面预留出一些空间来做计算。
然后把这个扩展后的数据当作被除数,生成多项式当作除数,进行二进制除法运算。
这个除法可不像咱们平时做的整数除法那么简单,但也别怕,按照二进制的规则来就好。
2.3 得到校验值。
经过除法运算后,得到的余数就是我们要的CRC校验值啦。
这个校验值就像是数据的一个独特标识,就像每个人都有自己独特的指纹一样。
把这个校验值附加在原始数据后面一起发送或者存储。
3.1 在通信中的应用。
在通信领域,CRC检验计算方法可是大功臣。
比如说在网络传输中,数据在各种网络设备之间穿梭,就像小蚂蚁在迷宫里找路一样。
在这个过程中,数据很可能会受到干扰或者出现错误。
有了CRC检验,就能够及时发现错误,避免错误数据继续传播,这就像在路口设了个检查关卡,把不合格的“车辆”拦下来。
3.2 数据存储中的意义。
crc校验公式
crc校验公式
【实用版】
目录
1.CRC 校验公式概述
2.CRC 校验公式的计算方法
3.CRC 校验公式的应用实例
4.CRC 校验公式的优缺点
正文
CRC(Cyclic Redundancy Check,循环冗余校验)是一种基于二进制多项式的数据传输错误检测技术。
CRC 校验公式就是用来计算 CRC 校验码的公式,通过在数据传输过程中附加一些校验位,然后接收方在接收到数据后,通过相同的 CRC 校验公式,对数据进行校验,以判断数据是否在传输过程中发生改变或错误。
CRC 校验公式的计算方法如下:
1.首先选定一个二进制多项式,这个多项式可以看作是一个除数。
2.将待发送的数据用二进制表示,并对其进行编码,附加一些校验位,形成一个新的二进制数。
3.使用选定的二进制多项式去除这个新的二进制数,得到一个余数。
4.将这个余数附加在原始数据的后面,形成一个新的数据。
5.在接收端,使用相同的二进制多项式对收到的数据进行除法运算,得到的余数就是 CRC 校验码。
6.将 CRC 校验码与发送端附加的校验码进行比较,如果二者相同,则认为数据传输正确,否则认为数据传输错误。
CRC 校验公式的应用实例非常广泛,例如在网络通信、数据存储、无
线通信等领域都有应用。
它的主要优点是对于小规模的数据传输错误,具有很好的检测能力,而且计算简单,易于实现。
但是,对于大规模的传输错误,CRC 校验公式的检测能力会降低,而且如果二进制多项式选择不当,可能会出现误检的情况。
CRC校验计算方法
CRC校验计算⽅法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码字。
标准CRC⽣成多项式如下表:名称⽣成多项式简记式* 标准引⽤CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8 x8+x6+x4+x3+x2+x1 0x5ECRC-12 x12+x11+x3+x+1 80FCRC-16 x16+x15+x2+1 8005 IBM SDLCCRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCSCRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCSCRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP基本算法(⼈⼯笔算):以CRC16-CCITT为例进⾏说明,CRC校验码为16位,⽣成多项式17位。
CRC算法原理及C语言实现
CRC算法原理及C语言实现CRC(Cyclic Redundancy Check)循环冗余校验算法是一种常用的错误检测算法,广泛应用于数据通信、存储等领域。
它通过对发送的数据进行多项式计算,得到一个校验值,然后将这个校验值附加到数据末尾,接收方再进行校验,通过比较接收到的校验值和重新计算的校验值来判断数据是否出现错误。
本文将介绍CRC算法的原理以及如何使用C语言实现。
一、CRC算法原理1.多项式表示CRC算法使用一个多项式来进行计算,这个多项式称为校验多项式(Generator Polynomial)。
在CRC算法中,校验多项式是一个二进制数,其中最高位为1,低位为0。
例如,CRC-32算法的校验多项式是0x04C11DB72.计算过程(1)初始化:将校验值设为一个固定的初始值,通常为全为0的二进制数。
(2)数据处理:逐位处理输入的数据,包括附加校验值的数据。
(3)除法运算:对每一位数据按位异或,然后进行除法运算,取余数。
(4)更新校验值:将余数与下一位数据进行异或运算,再将结果作为新的校验值。
(5)重复上述步骤,直到处理完所有的数据。
3.校验结果CRC算法的校验结果即为最后得到的校验值。
在进行校验时,接收方使用相同的校验多项式,对接收到的数据进行相同的操作,得到的校验值与发送方发送的校验值进行比较,如果相同,则说明数据未发生错误,否则则说明数据出现了错误。
二、C语言实现CRC算法下面是一个简单的C语言实现CRC算法的例子,以CRC-32算法为例:```c#include <stdio.h>//初始化校验值unsigned int crc32_inireturn 0xFFFFFFFF;//计算CRC值unsigned int i, j;for (i = 0; i < length; i++)crc = crc ^ data[i];for (j = 0; j < 8; j++)if ((crc & 1) != 0)crc = (crc >> 1) ^ CRC32_POLYNOMIAL;} elsecrc = crc >> 1;}}}return crc;int maiunsigned char data[] = "Hello, World!";unsigned int crc = crc32_init(;printf("CRC-32 value: %08X\n", crc ^ 0xFFFFFFFF);return 0;```以上就是CRC算法的原理及使用C语言实现的内容。
crc校验算法
crc校验算法crc校验的描述:1.CRC校验原理CRC校验的原理的难易暂不评价,毕竟会者不难,难者不会么。
CRC校验的根本思想是在要发送的帧之后附加⼀个数(CRC校验值),⽣成⼀个新帧,然后发送给接收端。
当然,这个附加的数并不是随意的,他要使新⽣成的帧能在发送端和接收端选定的某个特定的数整除。
当然,这个特定的数和整除的⽅法也不是随意的,特定的数是经过多次论证选定的⼀些列数,这在之后会述说,整除的⽅法是模2除法。
模2除法(crc原理最核⼼的思想)模2除法与算术除法类似,都是除法,不同的是,除的时候既不向上借位,也不⽐较除数和被除数的⼤⼩,只要以相同的位数进⾏相除即可。
模2加法:1+1=0,0+1=1, 0+0=0,⽆进位也⽆借位;模2减法:1-1=0, 0-1=1,0-0=0,也⽆进位,⽆借位,相当于⼆进制中的异或运算。
即⽐较后,相同为0,相异为1。
如100101除以1110,结果的商为11,余数为1.关于模2除法中除数的选择,这个你可以⾃⼰随意选择,开玩笑的,随意选择的除数,会导致帧校验的正确率下降,这是不确定的,要看你选择的除数。
⽽我们⼀般的除数的选择是直接去参照⼀些专家讲过多次试验下来的⼀些除数,这些除法能极⼤的保证帧校验的正确率。
⼀般⽽⾔crc8校验的错误率为1/256,crc16校验的错误率为1/65536,crc32校验的错误率为1/(65536*65536).那这⾥就有⼀个问题,我们传送的是⼀串字节数据,⽽不是⼀个数据,怎么将⼀串数字变成⼀个数据呢?这也很简单,⽐如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),⽐如数字是0x01,0x02,0x03,那么对应的数字就是0x10203;依次类推。
如果字节数很多,那么对应的数就⾮常⾮常⼤,不过幸好CRC只需要得到余数,⽽不需要得到商。
crc校验过程
crc校验过程CRC校验过程CRC(Cyclic Redundancy Check)校验是一种常用的错误检测技术,广泛应用于数据传输和存储领域。
它通过对数据进行特定的计算,生成校验码,用于检测数据在传输或存储过程中是否发生错误。
CRC校验的基本原理是利用多项式除法,将待发送的数据与一个固定的生成多项式进行除法运算。
具体过程如下:1. 确定生成多项式在CRC校验中,生成多项式是一个固定的多项式,不同的CRC标准使用不同的生成多项式。
常见的生成多项式有CRC-8、CRC-16和CRC-32等。
生成多项式通常以二进制形式表示,例如CRC-8的生成多项式为x^8 + x^7 + x^2 + 1。
2. 添加冗余位在待发送的数据后面添加一定数量的冗余位,冗余位的数量取决于生成多项式的位数。
添加冗余位的目的是为了能够检测到任何一位的错误。
3. 进行除法运算将添加冗余位后的数据与生成多项式进行除法运算。
具体步骤是先将生成多项式左移,使其最高位对齐被除数的最高位,然后进行异或运算,将结果作为新的被除数,重复这个过程直到被除数的位数小于生成多项式的位数。
4. 得到校验码除法运算结束后,余数就是校验码。
校验码的位数与生成多项式的位数相同。
将校验码附加到待发送的数据后面,形成最终的帧。
5. 接收端校验接收端在接收到数据后,也会进行CRC校验。
接收端使用与发送端相同的生成多项式进行除法运算,如果余数为0,则说明数据没有错误;如果余数不为0,则说明数据发生了错误。
6. 性能评估CRC校验的性能可以通过两个指标来评估,一个是误码率(BER),即在传输过程中发生错误的比特数与发送的比特数之比;另一个是检测能力,即CRC码能够检测到的错误比特数。
通过以上步骤,CRC校验可以有效地检测数据传输或存储过程中的错误。
值得注意的是,CRC校验只能检测错误,而不能纠正错误。
如果数据发生错误,接收端只能丢弃这部分数据或请求重新传输。
总结CRC校验是一种常用的错误检测技术,通过对数据进行特定的计算,生成校验码,用于检测数据在传输或存储过程中是否发生错误。
CRC校验算法的分析及C语言实现
CRC校验算法的分析及C语言实现CRC(Cyclic Redundancy Check)是一种简单但有效的校验算法,广泛用于数据通信中的错误检测。
它通过多项式除法实现,可以高效地检测数据传输中的位错误。
以下是对CRC校验算法的分析以及C语言实现。
分析:CRC校验算法基于多项式除法的原理。
它使用一个固定的生成多项式(G),将待校验的数据(信息位)和校验位合并在一起进行除法运算。
在发送端,将生成的余数校验位附加到数据后面一起传输;在接收端,再次进行除法运算,如果整个除法运算的余数为0,则表示数据传输无错误,否则表示数据有错误。
CRC校验算法的核心是生成多项式,它决定了校验能够检测的错误类型和错误个数。
常用的生成多项式有CRC-8、CRC-16和CRC-32、生成多项式的选择需要根据具体的应用场景和需求进行权衡,不同的生成多项式对应不同的CRC校验算法。
C语言实现:以下是一个简单实现CRC-16校验算法的示例代码:```c#include <stdio.h>#define CRC_POLYNOMIAL 0x8005unsigned int crc16(unsigned char* data, int length)unsigned int crc = 0;int i, j;for (i = 0; i < length; i++)crc ^= (unsigned int)data[i] << 8;for (j = 0; j < 8; j++)if (crc & 0x8000)crc = (crc << 1) ^ CRC_POLYNOMIAL;} elsecrc <<= 1;}}}return crc;int maiunsigned char data[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB}; int length = sizeof(data) / sizeof(data[0]);unsigned int checksum = crc16(data, length);printf("Checksum: 0x%04X\n", checksum);return 0;```在该示例代码中,`crc16`函数接受待校验的数据和数据长度作为输入,返回计算得到的CRC校验值。
crc校验码的计算方法
crc校验码的计算方法
校验码也称和校验、检验码,是一称错误检测技术。
其目的是确定在
传输、存储过程中,由于种种原因出现的数据错误,检测出这一类错误,能够快速进行数据信息的纠正和恢复,以便保证最大限度的信息
准确性。
一、CRC校验码
1、CRC算法原理
CRC(Cyclic Redundancy Check)校验码是一种数据错误检测技术,它
通过运算数据和已知校验码(参考值),来检验数据的准确性,它的
原理是用减法校验。
2、CRC校验过程
(1)选择一个固定的计算系数k。
(2)根据传输的数据K位为校验码,计算结果称为校验码。
(3)用已计算出的校验码和未知校验码作比较,若结果相同则数据正确,反之数据则有误。
3、CRC校验码的优缺点
(1)优点:比较有效,且校验码可变;
(2)缺点:计算过程复杂,计算量大,校验时间久,并且容易受干扰。
二、校验码的种类
(1)LRC(Longitudinal Redundancy Check)校验码
LRC校验码是一种用于错误检测的技术,采用垂直纵向校验来检查每
一列数据,用不同位数求取出LRC位,传输可靠性比CRC校验要高。
(2)ALSC(Advanced Longitudinal Signature Character)校验码
通过字符间的比较,不仅可以检测出一个字符的错乱,还可以检测出
多个字符的错顺、重复、错码等多种情况。
(3)奇偶校验码
奇偶校验码是一种简单的校验技术,只能检查出一位或多位数据错误,相对CRC校验,它的可靠性较低。
CRC算法原理详解
CRC算法原理详解CRC(循环冗余校验码)是一种基于多项式除法的错误检测方法,常用于数据通信或存储领域。
它使用了循环移位寄存器和异或运算来计算校验码。
CRC的基本原理是将需要传输或存储的数据看作一个二进制数,并且通过一个除数来进行除法运算。
除数通常是一个多项式,在计算上被视为一个二进制数。
除法运算中,被除数通过一系列的异或运算和左移操作与除数进行计算。
最后,得到的余数作为校验码被附加到原始数据的末尾。
下面是CRC的基本计算过程:1.首先,选择一个合适的除数(CRC多项式),通常用一个二进制数表示。
除数的位数决定了校验码的位数和校验能力。
2.将数据看作一个二进制数,并在数据的末尾添加n个0,其中n是除数的位数减1,例如,如果除数是8位,则在数据的末尾添加7个0。
这个过程通常称为填充。
3.将填充后的数据放入循环移位寄存器(CRC寄存器),该寄存器有一个初始值,在计算过程中会不断更新。
4.从左向右,逐位地将数据与除数进行异或运算。
如果数据的当前位为1,则执行异或运算,否则,继续下一位。
5.使用左移操作,将得到的结果作为新的数据放入寄存器。
寄存器的最高位将被丢失,然后在最低位补0。
6.重复第4和第5步,直到所有数据都被处理完毕。
7.最后,将循环移位寄存器中的值作为校验码附加到原始数据的末尾。
在接收方,使用相同的除数和计算过程来计算接收到的数据的校验码。
如果接收到的数据没有被篡改,那么计算出的校验码应该与接收到的校验码完全一致。
如果两个校验码不同,则表示数据被错误地传输或存储。
在CRC中,选择合适的除数十分重要。
不同的除数具有不同的校验能力和错误检测率。
常用的CRC算法包括CRC-8、CRC-16和CRC-32等。
除数的选择一般是根据需求和实际应用来决定的。
1.高效性:CRC算法的计算过程非常简单和高效,可以在硬件或软件中快速实现。
2.可靠性:CRC能够检测出广泛的错误类型,包括单位错误、传输错误和存储错误等。
循环冗余校验(CRC)算法入门引导
写给嵌入式程序员的循环冗余校验(CRC)算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。
在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验。
因此,掌握基本的CRC算法应是嵌入式程序员的基本技能。
可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,平常在项目中见到的CRC的代码多数都是那种效率非常低下的实现方式。
其实,在网上有一篇介绍CRC 算法的非常好的文章,作者是Ross Williams,题目叫:“A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS”。
我常将这篇文章推荐给向我询问CRC算法的朋友,但不少朋友向我抱怨原文太长了,而且是英文的。
希望我能写篇短点的文章,因此就有了本文。
不过,我的水平比不了Ross Williams,我的文章肯定也没Ross Williams的写的好。
因此,阅读英文没有障碍的朋友还是去读Ross Williams的原文吧。
本文的读者群设定为软件开发人员,尤其是从事嵌入式软件开发的程序员,而不是专业从事数学或通讯领域研究的学者(我也没有这个水平写的这么高深)。
因此,本文的目标是介绍CRC算法的基本原理和实现方式,用到的数学尽量控制在高中生可以理解的深度。
另外,鉴于大多数嵌入式程序员都是半路出家转行过来的,不少人只会C语言。
因此,文中的示例代码全部采用C语言来实现。
作为一篇入门短文,文中给出的代码更注重于示范性,尽可能的保持易读性。
因此,文中的代码并不追求最高效的实现,但对于一般的应用却也足够快速了。
从奇偶校验说起所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到的数据是否和发送出的数据相同。
比如说RS232串行通讯可以设置奇偶校验位,所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。
比如我们要发送的字节是0x1a,二进制表示为0001 1010。
重难点详解-CRC校验
CRC校验原理及代码什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。
当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。
到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。
因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。
如果有余数,则表明该帧在传输过程中出现了差错。
模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。
在循环冗余校验码(CRC)的计算中有应用到模2除法。
模2除法原则:1、被除数的首位为1,商为12、被除数的首位为0,商为03、模2除法等同于按位异或,要保证每次除完首位都为0,才能进行右移异或:同为0,不同为14、计算时每次右移一位,当被除数的位数小于除数,其为余数例:CRC校验码计算示例:现假设选择的CRC生成多项式为G(X)= X4+ X3+ 1,要求出二进制序列10110011的CRC校验码。
下面是具体的计算过程:①将多项式转化为二进制序列,由G(X)= X4+ X3+ 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。
一文讲透CRC校验码
一文讲透CRC校验码一、CRC概念1. 什么是CRC?CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和。
数据通信领域中最常用的一种差错校验码,其信息字段和校验字段长度可以任意指定,但要求通信双方定义的CRC标准一致。
主要用来检测或校验数据传输或者保存后可能出现的错误。
它的使用方式可以说明如下图所示:在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。
为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。
检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。
2. 使用方法概述循环冗余校验是一种用于校验通信链路上数字传输准确性的计算方法(通过某种数学运算来建立数据位和校验位的约定关系的)。
发送方计算机使用某公式计算出被传送数据所含信息的一个值,并将此值附在被传送数据后,接收方计算机则对同一数据进行相同的计算,应该得到相同的结果。
如果这两个 CRC结果不一致,则说明发送中出现了差错,接收方计算机可要求发送方计算机重新发送该数据。
3. 应用广泛在诸多检错手段中,CRC是最著名的一种。
CRC的全称是循环冗余校验,其特点是:检错能力强,开销小,易于用编码器及检测电路实现。
从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。
从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。
因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
crc 校验方法
crc 校验方法CRC校验方法概述CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,它通过对数据进行简单的计算,生成校验码,以验证数据在传输或存储过程中是否发生错误。
本文将详细介绍CRC校验方法的原理、计算过程以及应用。
一、CRC校验原理CRC校验方法基于多项式除法,通过对待校验数据与生成多项式进行除法运算,得到余数作为校验码。
校验码的长度通常为固定值,比如CRC-16(16位CRC校验码)或CRC-32(32位CRC校验码)。
二、CRC校验计算过程1. 选择生成多项式:根据需求选择合适的生成多项式,如CRC-16采用的生成多项式是x^16 + x^15 + x^2 + 1。
2. 准备待校验数据:将待校验数据转换成二进制形式。
3. 添加校验位:在待校验数据的末尾添加与生成多项式位数相同的0,得到扩展数据。
4. 除法运算:将扩展数据与生成多项式进行模2除法运算,得到余数。
5. 得到校验码:将余数作为校验码添加到原始数据中,形成最终的数据帧。
三、CRC校验应用1. 数据传输中的错误检测:在数据传输过程中,发送方对数据进行CRC校验并将校验码附加在数据帧中,接收方收到数据后也进行CRC 校验,通过比较计算得到的校验码与接收到的校验码是否一致,可以判断数据是否出现错误。
2. 存储介质的数据完整性验证:在磁盘、光盘等存储介质上,数据经过CRC校验后写入,读取时再进行校验,以确保数据的完整性。
3. 网络通信中的数据校验:在以太网、无线通信等网络通信中,CRC校验用于检测数据帧在传输过程中是否发生错误。
4. 文件校验:CRC校验常用于校验下载文件的完整性,通过比较计算得到的校验码与提供的校验码是否一致,可以判断文件是否被修改或损坏。
四、CRC校验的优缺点1. 优点:- 简单高效:CRC校验方法计算简单,速度快。
- 高可靠性:CRC校验能够有效检测多种错误类型,包括单比特错误和多比特错误。
CRC码计算及校验原理计算
CRC码计算及校验原理计算
CRC(Cyclic Redundancy Check)码是一种常用的错误检测码,用于验证数据在传输过程中是否发生错误。
CRC码的计算和校验原理是通过生成多项式对数据进行计算和校验。
以下是CRC码计算及校验原理的详细解释。
一、CRC码的计算原理:
1.选择一个生成多项式G(x),比如G(x)=x^3+x^2+1
2.假设要发送的数据为D(x),将D(x)乘以x的次数等于生成多项式的次数再取模,得到一个除数。
3.将除数与G(x)进行异或运算,产生余数。
4.将余数拼接到原始数据D(x)的后面,得到新的数据N(x)。
5.将数据N(x)进行发送。
二、CRC码的校验原理:
1.接收到数据N(x)后,用生成多项式G(x)去除以接收的数据N(x)。
2.如果除数为0,则认为数据没有发生错误,否则则认为数据发生了错误。
举例说明:
1.计算步骤:
2.校验步骤:
-用生成多项式G(x)去除以接收的数据N(x),得到商和余数。
-如果余数为0,说明数据没有发生错误,否则说明数据发生了错误。
通过以上计算和校验步骤,可以判断数据在传输过程中是否发生错误。
CRC码的优点是简单、效率高,能够检测到大部分错误,被广泛应用
在通信、存储等领域。
然而,CRC码只能检测错误,不能纠正错误。
当数
据发生错误时,需要重新发送数据或通过其他方法进行纠错处理。
CRC校验算法详解
CRC校验算法详解循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的错误校验算法,主要用于数据传输过程中的差错检测。
它将数据视为二进制数,通过生成多项式与数据进行异或运算,最后产生一个余数,将该余数作为校验码附加在数据末尾,接收方通过相同的生成多项式进行校验,如果余数为0,则认为数据传输无误。
CRC校验算法的基本原理是:通过生成多项式对整个数据进行模2除法运算,并得到一个余数作为校验码。
在数据传输过程中,发送方将原始数据和校验码一起发送给接收方,接收方利用相同的生成多项式对整个数据进行除法运算,并检查余数是否为0,来判断数据传输是否正确。
1.确定生成多项式:CRC校验算法中最重要的是生成多项式,它决定了校验能力的大小。
生成多项式通常在最高位和最低位都为1,其他位数也应该尽量选择为1、常用的生成多项式有CRC-8、CRC-16、CRC-32等,每种生成多项式的校验能力不同。
2.将生成多项式转换为二进制数:将生成多项式转换为二进制数表示,用多项式系数的二进制表示法来表示生成多项式。
3.将待发送的数据与校验码进行拼接:在发送数据的最后面添加足够位数的0,等于生成多项式次数减1,将生成多项式次方数减1的二进制表示添加到待发送的数据末尾。
4.进行模2除法运算:将待发送的数据与生成多项式进行模2除法运算,将得到的余数作为校验码。
5.发送数据与校验码:将原始数据与校验码一起发送给接收方,接收方接收到数据后利用相同的生成多项式进行除法运算。
6.检验余数是否为0:接收方进行除法运算后,检查得到的余数是否为0,如果余数为0,则认为数据传输无误;如果余数不为0,则认为数据传输存在错误。
CRC校验算法的优点是简单且高效,能够检测多位错误,且校验码的长度可以根据生成多项式的次方数来确定,可以根据不同的数据传输要求进行调整。
缺点则是无法纠正错误,只能检测错误的存在,需要额外的处理机制来进行纠正。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CRC校验算法学习(这个算法看了很多遍了,都是囫囵吞枣,这次将资料拷贝到这里,好好学习一下) (2008-2-23 23:18)CRC校验采用多项式编码方法。
被处理的数据块可以看作是一个二进制多项式,例如,10110101可以看作是2^7+2^5+2^4+2^2+2^0,多项式乘除法运算过程与普通代数多项式的乘除法相同。
多项式的加减法运算以2为模,加减时不进,错位,和逻辑异或运算一致。
采用CRC校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1。
CRC的处理方法是:发送方以g(x)去除t(x),得到余数作为CRC 校验码。
校验时,以计算的校正结果是否为0为据,判断数据帧是否出错。
CRC校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k为g(x)的阶数)的突发错误。
所以CRC的生成多项式的阶数越高,那么误判的概率就越小。
CCITT建议:2048 kbit/s的PCM基群设备采用CRC-4方案,使用的CRC校验采用16位CRC校验。
在IBM的同步数据链路控制规程SDLC的帧校验序列FCS中,使用CRC-16。
g(x)的位数越高,检错能力就越强。
由于CRC-32的可靠性,把CRC-32用于重要数据传输十分合适,所以在通信、计算机等领域运用十分广泛。
在一些UART通信控制芯片(如MC6582、Intel8273和Z80-SIO)内,都采用了CRC校验码进行差错控制;以太网卡芯片、MPEG解码芯片中,也采用CRC-32进行差错控制。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>(转自/forum/viewthread.php?tid=5470&sid=3rrqV omR)CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。
通常,CRC 的除数用生成多项式来表示。
最常用的CRC码的生成多项式有CRC16,CRC32.以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
K(X)>>16=G(x)Q(x)+R(x)求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。
生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。
用软件计算CRC 码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5+1, CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CRC校验码的算法分析CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。
其实现步骤如下:设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。
在数据块的末尾添加r个0,数据块的长度增加到m+r位,对应的二进制多项式为。
用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。
此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。
用以模2的方式减去y(x),得到二进制多项式。
就是包含了CRC校验码的待发送字符串。
从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式,所以解码时可以用接受到的数据去除g (x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。
许多CRC的硬件解码电路就是按这种方式进行检错的。
同时可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
为了更清楚的了解CRC校验码的编码过程,下面用一个简单的例子来说明CRC校验码的编码过程。
由于CRC-32、CRC-16、CCITT和CRC-4的编码过程基本一致,只有位数和生成多项式不一样。
为了叙述简单,用一个CRC-4编码的例子来说明CRC的编码过程。
设待发送的数据t(x)为12位的二进制数据100100011100;CRC-4的生成多项式为g(x)= ,阶数r为4,即10011。
首先在t(x)的末尾添加4个0构成,数据块就成了1001000111000000。
然后用g(x)去除,不用管商是多少,只需要求得余数y(x)。
下表为给出了除法过程。
除数次数被除数/ g(x)/结果余数0 1 001000111000000 1001110000001 00110 0001001110000001 1 00111000000 10000001 00110 000010000002 1 000000 11001 00110 001100从上面表中可以看出,CRC编码实际上是一个循环移位的模2运算。
对CRC-4,我们假设有一个5 bits的寄存器,通过反复的移位和进行CRC的除法,那么最终该寄存器中的值去掉最高一位就是我们所要求的余数。
所以可以将上述步骤用下面的流程描述://reg是一个5 bits的寄存器把reg中的值置0.把原始的数据后添加r个0.While (数据未处理完)BeginIf (reg首位是1)reg = reg XOR 0011.把reg中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
Endreg的后四位就是我们所要求的余数。
这种算法简单,容易实现,对任意长度生成多项式的G(x)都适用。
在发送的数据不长的情况下可以使用。
但是如果发送的数据块很长的话,这种方法就不太适合了。
它一次只能处理一位数据,效率太低。
为了提高处理效率,可以一次处理4位、8位、16位、32位。
由于处理器的结构基本上都支持8位数据的处理,所以一次处理8位比较合适。
为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一下。
在上面例子中,可以将编码过程看作如下过程:由于最后只需要余数,所以我们只看后四位。
构造一个四位的寄存器reg,初值为0,数据依次移入reg0(reg的0位),同时reg3的数据移出reg。
有上面的算法可以知道,只有当移出的数据为1时,reg才和g(x)进行XOR运算;移出的数据为0时,reg不与g(x)进行XOR运算,相当与和0000进行XOR运算。
就是说,reg和什么样的数据进行XOR移出的数据决定。
由于只有一个bit,所以有种选择。
上述算法可以描述如下,//reg是一个4 bits的寄存器初始化t[]={0011,0000}把reg中的值置0.把原始的数据后添加r个0.While (数据未处理完)Begin把reg中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
reg = reg XOR t[移出的位]End上面算法是以bit为单位进行处理的,可以将上述算法扩展到8位,即以Byte为单位进行处理,即CRC-32。
构造一个四个Byte的寄存器reg,初值为0x00000000,数据依次移入reg0(reg的0字节,以下类似),同时reg3的数据移出reg。
用上面的算法类推可知,移出的数据字节决定reg和什么样的数据进行XOR。
由于有8个bit,所以有种选择。
上述算法可以描述如下://reg是一个4 Byte的寄存器初始化t[]={…}//共有=256项把reg中的值置0.把原始的数据后添加r/8个0字节.While (数据未处理完)Begin把reg中的值左移一个字节,读入一个新的字节并置于reg的第0个byte的位置。
reg = reg XOR t[移出的字节]End算法的依据和多项式除法性质有关。
如果一个m位的多项式t(x)除以一个r阶的生成多项式g(x),,将每一位(0=<k<m)提出来,在后面不足r个0后,单独去除g(x),得到的余式位。