CRC算法

合集下载

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循环冗余码计算CRC(循环冗余码)是一种常用于错误检测的编码技术。

它通过对数据进行计算,并附加一个校验码,以便在数据传输过程中检测出错误。

本文将介绍CRC的原理、计算方法以及应用领域。

一、CRC的原理CRC是一种循环冗余校验码,它的原理是通过对数据进行除法运算来生成校验码。

具体步骤如下:1. 首先,选择一个生成多项式G(通常用二进制表示),并确定校验码的位数(通常和G的次数相同)。

2. 将数据进行左移,使其比G的次数多一位,然后用G来除这个左移后的数据,得到余数。

3. 将这个余数附加到原始数据的末尾,得到带有校验码的数据。

二、CRC的计算方法CRC的计算方法比较简单,可以通过以下步骤进行:1. 将数据转换为二进制形式。

2. 在数据末尾添加若干个0,位数等于校验码的位数。

3. 用生成多项式G来除这个新的数据,得到余数。

4. 将这个余数附加到原始数据的末尾,得到带有校验码的数据。

三、CRC的应用领域CRC广泛应用于数据通信和存储领域,常见的应用包括:1. 网络通信:在网络通信中,CRC被用于验证数据包的完整性,以确保数据的准确传输。

2. 存储介质:在硬盘、闪存等存储介质中,CRC被用于检测和纠正数据的错误。

3. 无线电通信:在无线电通信中,CRC可用于验证无线电信号的完整性,以提高通信质量。

4. 数据校验:在数据传输过程中,CRC可以用于检测是否出现了错误或数据损坏。

四、CRC的优势和不足CRC具有以下优势:1. 算法简单:CRC的计算方法相对简单,可以快速计算校验码。

2. 高效性:CRC能够检测多种错误类型,包括单比特错误、多比特错误以及奇偶位错误。

3. 可靠性:CRC的位数越多,检测错误的能力越强,提高了数据传输的可靠性。

然而,CRC也存在一些不足之处:1. 无法纠正错误:CRC只能检测错误,无法纠正数据中的错误。

2. 传输效率:CRC需要在数据传输过程中附加校验码,从而增加了传输的开销。

CRC校验算法详解及代码实现

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异或校验算法

crc异或校验算法CRC异或校验算法CRC(Cyclic Redundancy Check)异或校验算法是一种常用的数据校验算法,通过对数据进行异或运算来检测数据传输过程中是否出现错误。

本文将介绍CRC异或校验算法的原理、实现步骤以及一些应用场景。

一、原理CRC异或校验算法的原理基于二进制数的异或运算。

在数据传输过程中,发送方通过对数据进行异或运算,生成校验码,然后将数据和校验码一起发送给接收方。

接收方收到数据后,同样对数据进行异或运算,得到一个校验码。

如果接收到的校验码与计算得到的校验码一致,说明数据传输过程中没有出现错误。

反之,如果校验码不一致,就意味着数据出现错误。

二、实现步骤CRC异或校验算法的实现步骤如下:1.选择一个生成多项式,通常采用标准的CRC-16、CRC-32等多项式。

2.将生成多项式转换为二进制数,并且在最高位补1。

3.将要发送的数据转换为二进制数。

4.将数据的最高位与生成多项式的最高位对齐,然后进行异或运算。

5.将异或运算结果后移一位,并将下一位数据与生成多项式最高位进行异或运算。

6.重复上述步骤,直到所有数据都进行过异或运算。

7.最后得到的结果就是校验码,将校验码附加到数据后发送给接收方。

三、应用场景CRC异或校验算法广泛应用于数据通信领域,特别是在串口通信、以太网通信和无线通信中。

由于其简单高效的特点,CRC异或校验算法被广泛接受并应用于各种通信协议中。

以下是一些常见的应用场景:1.串口通信:在串口通信中,为了保证数据的可靠传输,常常使用CRC异或校验算法对数据进行校验。

接收方在接收到数据后,通过对数据进行异或运算,判断数据是否正确。

2.以太网通信:在以太网通信中,CRC异或校验算法用于检测数据帧是否出现错误。

接收方通过对数据帧进行异或运算,判断数据是否正确,如果校验码不一致,则丢弃该数据帧。

3.无线通信:在无线通信中,由于受到信道干扰等因素的影响,数据很容易出现错误。

CRC校验码计算详解

CRC校验码计算详解

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校验码的计算过程非常简单,可以很容易地实现。

CRC算法原理及C语言实现

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_计算方法
略了,有些迷惑哦。要是生成多项式要是都省了,那还怎么校验?我猜想可能是中间的全为
一吧。
生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。 I、基本算法(人工笔算):
以 CRC16-CCITT 为例进行说明,CRC 校验码为16位,生成多项式17位。假如数据流为4 字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]; 数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算
3、CRC 校验码软件生成方法:
借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应 m(x)=x6+x4+x3+1
假设生成多项式为:g(x)=x4+x3+1;则对应 g(x)的代码为: 11001
x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;
3、CRC 码集选择的原则:若设码字长度为 N,信息字段为 K 位,校验字段为 R 位(N=K+R), 则对于 CRC 码集中的任一码字,存在且仅存在一个 R 次多项式 g(x),使得

V(x)=A(x)g(x)=xRm(x)+r(x);
其中: m(x)为 K 次信息多项式, r(x)为 R-1次校验多项式,
否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得); 3)重复第2步,直到数据流(6字节)全部移入寄存器; 4)寄存器中的值则为 CRC 校验码 CRC[1]、CRC[0]。
III、计算机算法2(字节型算法):256^n 表示256的 n 次方 把按字节排列的数据流表示成数学多项式,设数据流为 BYTE[n]BYTE[n-1]BYTE[n-

crc校验算法

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算法

一、循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来作错误侦测(Error Detecting)的。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

根据应用环境与习惯的不同,CRC又可分为以下几种标准:①CRC-12码;②CRC-16码;③CRC-CCITT码;④CRC-32码。

CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

下面以最常用的CRC-16为例来说明其生成过程。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。

重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。

所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

下面为CRC的计算过程:1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC 寄存器。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

CRC怎么计算

CRC怎么计算

很多人都在进行modbus通讯时,不知道如何计算CRC校验位,现在把算法分享给大家,希望能够有帮助。

在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。

CRC计算方法是:
1、加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。

2、把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。

3、把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。

4、如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。

5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。

6、重复步骤2和5,进行通讯信息帧下一个字节的处理。

7、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC 寄存器的高、低字节进行交换
8、最后得到的CRC寄存器内容即为:CRC校验码。

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校验和CRC各种算法CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于计算机网络和通信中的错误检测技术。

它通过生成一种校验和(Checksum)来验证数据的完整性,常用于串行通信以及存储介质中。

CRC校验的基本原理是将待校验的数据与一个固定的除数进行除法运算,得到的余数作为校验和附加到原数据后传输。

接收端接收到数据后也会进行同样的运算,将接收到的校验和与新计算出的余数进行比较,如果一致则说明数据无错误,否则则表明数据被篡改或损坏。

常见的CRC算法有很多种,包括CRC-8、CRC-16、CRC-32等不同的协议和标准所使用的CRC算法也有所不同。

下面介绍几种常见的CRC算法。

1.CRC-8算法:CRC-8校验采用8位的多项式,其生成多项式为x^8+x^2+x^1+1、具体实现时,可以使用一个256字节的查找表来加快计算速度。

2.CRC-16算法:CRC-16校验算法通常使用比较常见的多项式x^16+x^15+x^2+1、CRC-16有多个不同的变种,如CCITT、KERMIT等,不同的应用场景使用不同的生成多项式。

3. CRC-32算法:CRC-32校验算法使用32位的多项式,其生成多项式为0x04C11DB7、CRC-32更常用于以太网、ZIP、Gzip等领域,具有较高的校验能力。

以上只是常见的几种CRC算法示例,实际应用中还有更多不同的多项式和算法。

根据校验的需要,可以选择合适的多项式和位数。

实际应用中,CRC校验广泛用于数据传输、存储介质、以及计算机网络。

它可以有效地检测数据的传输错误,以及防止数据被篡改和损坏。

CRC校验通过简单的计算,具有高效、快速的特点。

总结来说,CRC校验利用除法运算和生成多项式,通过计算余数的方式生成校验和,从而保证数据的完整性和准确性。

通过选择合适的多项式和算法,可以满足不同应用场景的需求。

CRC校验在计算机网络和通信中被广泛应用,是一种简单而有效的错误检测技术。

CRC_计算方法

CRC_计算方法

CRC_计算方法CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测方法,用于验证数据在传输过程中是否出现错误。

CRC的计算方法非常简单,主要包括生成多项式(Generator Polynomial)的选择和计算过程两个步骤。

生成多项式:在进行CRC计算之前,首先需要选择一个生成多项式。

生成多项式是一个固定的二进制数,通常用一个多项式表示,其最高阶次低于校验字长。

生成多项式有很多种选择,常用的有CRC-8、CRC-16和CRC-32等。

计算过程:CRC计算的基本思想是将数据与生成多项式进行按位异或操作,然后逐位进行移位操作,直到移位次数等于数据位数加上生成多项式位数减一、最后,将最后一次异或的结果作为校验码附加在数据末尾。

计算步骤如下:1.初始化寄存器,将寄存器的值设置为全1或全0,具体取决于实际情况。

2.从数据的高位开始,将数据按位与寄存器的最高位进行异或操作,然后将寄存器中的所有位向左移一位。

3.如果异或的结果为1,再与一个预先定义的CRC多项式进行异或操作。

4.重复第2步和第3步,直到所有数据位和校验位都被处理。

5.最后得到的寄存器值就是CRC校验码,将其附加到数据末尾。

然后,从数据的高位开始,依次进行异或和移位操作:重复以上步骤,直到所有数据位处理完毕。

接收端在接收到数据后,同样按照生成多项式和计算过程进行CRC校验。

如果接收到的CRC校验码与计算的结果不一致,则说明数据在传输过程中发生了错误。

CRC的计算方法虽然简单,但可以有效地检测错误,并且具有很强的错误检测能力。

在实际应用中,CRC被广泛应用于网络传输、存储设备和通信协议等领域。

有许多不同的CRC算法可供选择,可以根据具体需求选择适合的算法。

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) 算法原理Cyclic R edundancy C heck循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。

算法原理假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k 位的值,对应g(x)中x^k的系数。

将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。

国际通行标准可以参看/wiki/Cyclic_redundancy_checkg(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。

比如将11001与10101做xor运算:明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。

CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

通过示例,可以发现一些规律,依据这些规律调整算法:1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。

若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。

2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。

这样就可以舍弃h的首位,将b取h的后m位。

比如CRC-8的h是111010101,b只需是11010101。

3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。

crc校验算法计算过程

crc校验算法计算过程

crc校验算法计算过程CRC(CyclicRedundancyCheck)循环冗余校验算法是在数据传输过程中应用的一种工具,有效的检测接收到的数据中只有很小的概率发生数据传输错误的情况,是目前应用最广泛的数据错误检测算法之一。

CRC算法可以将错误检测任务减少到接近于理想化的水平,针对随机等可能发生错误的计算机系统,它能够检测出所有位数不超过2k-1位的二进制错误,并能够检测出99.998%的随机等应用错误。

CRC校验算法计算过程主要包括四个步骤:1.将待校验的二进制数据段与预先设定的多项式进行按位模2的乘法运算,得到一个多项式结果。

2.将乘法结果按照CRC算法要求进行右移和异或运算,进行除法运算,得到的余数称为CRC码,即为所要求的校验位。

3.在发送时,将数据段与CRC码连接在一起,一起发给接收方。

4.接收方接收到报文后,将报文与CRC码分离,对数据段进行校验,并重复上述运算,得到CRC码,比较两者是否相等,以确定数据是否正确地传输到接收方。

CRC校验算法是在数据传输过程中应用的一种工具,可以有效地检测数据传输中只有很小概率发生的错误,是很多计算机系统的重要保证。

这里以一个简单的例子来说明CRC算法的计算过程。

假设有一个原始数据段是“11010010”,预先设定的要求多项式是“10001001”,那么CRC算法计算过程如下:1.将“11010010”按位与“10001001”进行乘法运算(即模2加法),得到结果是“01001001”。

2.将乘法运算结果按CRC算法的要求,右移一位,再将右移的结果和“10001001”进行异或,得到结果是“00001101”。

3.将两者再次右移一位,再将右移的结果和多项式“10001001”进行异或,得到结果是“00110001”。

4.再进行两次右移,再将右移的结果和多项式“10001001”进行异或,得到结果是“11001000”,这就是所要求的CRC码。

以上便是CRC算法的计算过程,可以看出,CRC算法是一个非常简单而又高效的数据错误检测算法。

crc计算公式

crc计算公式

crc计算公式CRC(循环冗余校验)是一种校验和算法,常用于数据传输和存储系统中,用于检测数据是否出错。

CRC的计算公式通常包括两个部分,一个是生成多项式( G enerator Polynomial)和一个初始值(Initial Value)。

CRC的计算公式如下:生成多项式:CRC算法使用一个固定的二进制多项式,通常表示为一个二进制数。

例如,常用的CRC-32生成多项式为0x04C11DB7。

初始值:CRC算法使用一个固定的初始值,通常表示为一个二进制数。

例如,CRC-32的初始值为0xFFFFFFFF。

计算过程:将数据按照一定的规则划分为多个字节,每个字节都进行一次异或运算,最后再整体进行一次异或运算。

具体步骤如下:将生成多项式和初始值设为当前值。

将数据按字节划分,每个字节与当前值进行一次异或运算。

将结果作为新的当前值。

重复步骤1-3,直到得到最终的CRC值。

例如,假设要计算一个长度为4字节的数据的CRC-32值,生成多项式为0x04C11DB7,初始值为0xFFFFFFFF。

计算过程如下:将生成多项式和初始值设为当前值:0xFFFFFFFF。

将数据的第一个字节与当前值进行异或运算:0xFFFFFFFF ^ 0x01020304 =0x05060708。

将结果作为新的当前值:0x05060708。

将数据的第二个字节与当前值进行异或运算:0x05060708 ^ 0x090A0B0C =0x0D0E0F0G。

将结果作为新的当前值:0x0D0E0F0G。

将数据的第三个字节与当前值进行异或运算:0x0D0E0F0G ^ 0x11121314 =0x15161718。

将结果作为新的当前值:0x15161718。

将数据的第四个字节与当前值进行异或运算:0x15161718 ^ 0x191A1B1C =0x1D1E1F1G。

将结果作为新的当前值:0x1D1E1F1G。

最终的CRC-32值为:最终的CRC-32值 = 最终的值 = 0x1D1E1F1G。

CRC算法

CRC算法

CRC的基本介绍CRC域是两个字节,包含一16位的二进制值。

它由传输设备计算后加入到消息中。

接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。

仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。

CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。

LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。

整个过程要重复8次。

在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。

最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。

CRC添加到消息中时,低字节先加入,然后高字节////////////////////////////////////////////////RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。

它忽略信息中单个字符数据的奇偶校验方法。

CRC码为2个字节,16位的二进制值。

由发送设备计算CRC值,并把它附到信息中去。

接收设备在接收信息过程中再次计算CRC值并与CRC的实际值进行比较,若二者不一致,亦产生一个错误,校验开始时,把16位寄存器的各位都置为“1”,然后把信息中的相邻2个8位字节数据放到当前寄存器中处理,只有每个字符的8位数据用于CRC处理。

起始位,停止位和校验位不参与CRC计算。

CRC校验时,每个8位数据与该寄存器的内容进行异或运算,然后向最低有效位(LSB)方向移位,用零填入最高有效位(MSB)后,再对LSB检查,若LSB=1,则寄存器与预置的固定值异或,若LSB=0,不作异或运算。

重复上述处理过程,直至移位8次,最后一次(第8次)移位后,下一个8位字节数据与寄存器的当前值异或,再重复上述过程。

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC算法与实现bhw98摘要: 本文首先讨论了CRC的代数学算法,然后以常见的CRC-ITU为例,通过硬件电路的实现,引出了比特型算法,最后重点介绍了字节型快速查表算法,给出了相应的C 语言实现。

关键词: CRC, FCS, 生成多项式, 检错重传引言CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。

它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。

实际上,除数据通信外,CRC在其它很多领域也是大有用武之地的。

例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。

差错控制理论是在代数理论基础上建立起来的。

这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下。

若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。

利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。

在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

这个规则,在差错控制理论中称为“生成多项式”。

1 代数学的一般性算法在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。

例如1100101 表示为1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即x6+x5+x2+1。

设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。

发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。

用公式表示为T(x)=x r P(x)+R(x)接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。

举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程为x r P(x) x3(x3+x2) x6+x5 x-------- = ---------- = -------- = (x3+x2+x) + --------G(x) x3+x+1 x3+x+1 x3+x+1即R(x)=x。

注意到G(x)最高幂次r=3,得出CRC为010。

如果用竖式除法,计算过程为1110-------1011 /1100000 (1100左移3位)1011----11101011-----10101011-----00100000----010因此,T(x)=(x6+x5)+(x)=x6+x5+x, 即1100000+010=1100010如果传输无误,T(x) x6+x5+x------ = --------- = x3+x2+x,G(x) x3+x+1无余式。

回头看一下上面的竖式除法,如果被除数是1100010,显然在商第三个1时,就能除尽。

上述推算过程,有助于我们理解CRC的概念。

但直接编程来实现上面的算法,不仅繁琐,效率也不高。

实际上在工程中不会直接这样去计算和验证CRC。

下表中列出了一些见于标准的CRC资料:* 统一去掉了,如04C11DB7实际上是104C11DB7。

** 前称CRC-CCITT。

ITU的前身是CCITT。

2 硬件电路的实现方法多项式除法,可用除法电路来实现。

除法电路的主体由一组移位寄存器和模2加法器(异或单元)组成。

以CRC-ITU为例,它由16级移位寄存器和3个加法器组成,见下图(编码/解码共用)。

编码、解码前将各寄存器初始化为"1",信息位随着时钟移入。

当信息位全部输入后,从寄存器组输出CRC结果。

3 比特型算法上面的CRC-ITU除法电路,完全可以用软件来模拟。

定义一个寄存器组,初始化为全"1"。

依照电路图,每输入一个信息位,相当于一个时钟脉冲到来,从高到低依次移位。

移位前信息位与bit0相加产生临时位,其中bit15移入临时位,bit10、bit3还要加上临时位。

当全部信息位输入完成后,从寄存器组取出它们的值,这就是CRC码。

typedef unsigned char bit;typedef unsigned char byte;typedef unsigned short u16;typedef union {u16 val;struct {u16 bit0 : 1;u16 bit1 : 1;u16 bit2 : 1;u16 bit3 : 1;u16 bit4 : 1;u16 bit5 : 1;u16 bit6 : 1;u16 bit7 : 1;u16 bit8 : 1;u16 bit9 : 1;u16 bit10 : 1;u16 bit11 : 1;u16 bit12 : 1;u16 bit13 : 1;u16 bit14 : 1;u16 bit15 : 1;} bits;} CRCREGS;// 寄存器组CRCREGS regs;// 初始化CRC寄存器组:移位寄存器置为全"1" void crcInitRegisters(){regs.val = 0xffff;}// CRC输入一个bitvoid crcInputBit(bit in){bit a;a = regs.bits.bit0 ^ in;regs.bits.bit0 = regs.bits.bit1;regs.bits.bit1 = regs.bits.bit2;regs.bits.bit2 = regs.bits.bit3;regs.bits.bit3 = regs.bits.bit4 ^ a;regs.bits.bit4 = regs.bits.bit5;regs.bits.bit5 = regs.bits.bit6;regs.bits.bit6 = regs.bits.bit7;regs.bits.bit7 = regs.bits.bit8;regs.bits.bit8 = regs.bits.bit9;regs.bits.bit9 = regs.bits.bit10;regs.bits.bit10 = regs.bits.bit11 ^ a;regs.bits.bit11 = regs.bits.bit12;regs.bits.bit12 = regs.bits.bit13;regs.bits.bit13 = regs.bits.bit14;regs.bits.bit14 = regs.bits.bit15;regs.bits.bit15 = a;}// 输出CRC码(寄存器组的值)u16 crcGetRegisters(){return regs.val;}crcInputBit中一步一步的移位/异或操作,可以进行简化:void crcInputBit(bit in){bit a;a = regs.bits.bit0 ^ in;regs.val >>= 1;if(a) regs.val ^= 0x8408;}细心的话,可以发现0x8408和0x1021(CRC-ITU的简记式)之间的关系。

由于我们是从低到高输出比特流的,将0x1021左右反转就得到0x8408。

将生成多项式写成G(x)=1+x5+x12+x16,是不是更好看一点?下面是一个典型的PPP帧。

最后两个字节称为FCS(Frame Check Sequence),是前面11个字节的CRC。

FF 03 C0 21 04 03 00 07 0D 03 06 D0 3A我们来计算这个PPP帧的CRC,并验证它。

byte ppp[13] = {0xFF, 0x03, 0xC0, 0x21, 0x04, 0x03, 0x00, 0x07, 0x0D, 0x03, 0x06, 0x00, 0x00};int i,j;u16 result;/////////// 以下计算FCS// 初始化crcInitRegisters();// 逐位输入,每个字节低位在先,不包括两个FCS字节for(i = 0; i < 11; i++){for(j = 0; j < 8; j++){crcInputBit((ppp[i] >> j) & 1);}}// 得到CRC:将寄存器组的值求反result = ~crcGetRegisters();// 填写FCS,先低后高ppp[11] = result & 0xff;ppp[12] = (result >> 8) & 0xff;/////////// 以下验证FCS// 初始化crcInitRegisters();// 逐位输入,每个字节低位在先,包括两个FCS字节for(i = 0; i < 13; i++){for(j = 0; j < 8; j++){crcInputBit((ppp[i] >> j) & 1);}}// 得到验证结果result = crcGetRegisters();可以看到,计算出的CRC等于0x3AD0,与原来的FCS相同。

验证结果等于0。

初始化为全"1",以及将寄存器组的值求反得到CRC,都是CRC-ITU的要求。

事实上,不管初始化为全"1"还是全"0",计算CRC取反还是不取反,得到的验证结果都是0。

4 字节型算法比特型算法逐位进行运算,效率比较低,不适用于高速通信的场合。

数字通信系统(各种通信标准)一般是对一帧数据进行CRC校验,而字节是帧的基本单位。

最常用的是一种按字节查表的快速算法。

该算法基于这样一个事实:计算本字节后的CRC码,等于上一字节余式CRC码的低8位左移8位,加上上一字节CRC右移8位和本字节之和后所求得的CRC码。

如果我们把8位二进制序列数的CRC(共256个)全部计算出来,放在一个表里,编码时只要从表中查找对应的值进行处理即可。

CRC-ITU的计算算法如下:a.寄存器组初始化为全"1"(0xFFFF)。

b.寄存器组向右移动一个字节。

c.刚移出的那个字节与数据字节进行异或运算,得出一个指向值表的索引。

d.索引所指的表值与寄存器组做异或运算。

相关文档
最新文档