循环冗余校验的原理及软件实现
循环冗余校验算法分析和实现
循环冗余校验算法分析和实现 ①杜杏菁②,刘春梅(华北科技学院计算机系,北京东燕郊 101601)摘 要:在网络中传输报文时,噪声干扰或传输中断等因素往往使接收端收到的报文出现错码。
为了及时可靠地把报文传输给对方并有效地检测错误,需要采用差错控制。
循环冗余校验CRC(Cyclic Redun2 dancy Check)是由分组线性码分支而来,其主要应用是二元码组。
循环冗余校验CRC编码简单且误判概率很低,在通信系统中得到了广泛的应用。
文中详细介绍了循环冗余校验CRC的差错控制原理及其实现方法。
关键词:循环冗余校验;异或运算;模2运算中图分类号:TP30116 文献标识码:A 文章编号:1672-7169(2005)03-0105-031 概述在数字通信系统中可靠与快速往往是一对矛盾。
若要求快速,则必然使得每个数据码元所占的时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误的可能性增加,传送信息的可靠性下降。
若是要求可靠,则使得传送消息的速率变慢。
因此,如何合理地解决可靠性与速度这一对矛盾是正确设计一个通信系统的关键问题之一。
为保证传输过程的正确性,需要对通信过程进行差错控制。
实现检错功能的差错控制方法很多有奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接收端。
接收端使用校验码对数据进行校验。
但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC是由分组线性码分支而来,其主要应用是二元码组,编码简单且误判概率很低,在通信系统中得到了广泛的应用。
下面重点介绍了CRC校验的原理及其算法实现。
2 循环冗余校验码(CRC)原理CRC码检错是将被处理报文的比特序列当作一个二进制多项式A(x)的系数,如一个8位二进制数10110101可以表示为:1x2+0x6+1x5 +1x4+0x3+1x2+0x+1,该系数除以发送方和接收方预先约定好的生成多项式g(x)后,将求得的余数P(x)作为CRC校验码附加到原始的报文上,并一起发给接收方。
循环冗余校验原理及程序
ENDIF;
IFdtemp(7)='1'THEN
dtemp(7DOWNTO2):=dtemp(7DOWNTO2)XORPOLYNOMIAL;
ENDIF;
IFdtemp(6)='1'THEN
dtemp(6DOWNTO1):=dtemp(6DOWNTO1)XORPOLYNOMIAL;
rdata_r <=X"000";
dfinish_r <='0';
error01_r <='0';
ELSIFhrecv='1'THEN
rdatacrc <=datacrci;
rdtemp :=datacrci(16DOWNTO5);
IFrdtemp(11)='1'THEN
rdtemp(11DOWNTO6):=rdtemp(11DOWNTO6)XORPOLYNOMIAL;
while(--len>=0)
{
ch=*crcbuf++;ch<<=8;
for(i=0;i<8;i++)
{
crc<<=1;
if((ch&0x8000)!=0)crc|=1;
if(crc>=gx)crc∧=gx;
ch<<=1;
}
}
return((crc==0)?0∶1)
}
以上CRC编码和校验函数结构良好,调用接口清晰,执行效率很高,且具有良好的可
hsend<=hsend_r;
datacrco<=datacrco_r;
CRC校验
用C语言实现CRC校验计算在编写数据传输程序时,数据容错是一个非常重要的问题。
循环冗余位校验(Cyclicl Redundncy Check英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。
CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。
如果单纯模拟硬件实现方法,则计算速度较慢。
笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。
首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。
组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。
这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。
下面给出用C语言编制的计算程序。
首先将CRC生成多项式及CRC值表定义为一个头文件CRC.H:#define CRC_CCITT 0x1021 //CCITT多项式#define REV_CCITT 0x8408 //反转CCITT多项式#define CRC16 0x8005 //CRC16多项式#define REV_CRC16 0x001 //反转CRC16多项式unsigned short crc_tble[256];//CRC值表注:16位CCITT多项式(X16 +X12 +X5 +1)和16位CRC16多项式(X16 +X15 +X2+1)为两种最常用的CRC多项式。
反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响CRC计算速度,故设反转多项式。
造表和查表法CRC计算函数。
#include crc.hvoid mk_crctble(unsigned short genpoly){unsigned short crc_tble[256];unsigned short ccnum=0;unsigned short i,j,k;for(i=0,k=0;i<256;i++,k++){i<<=8;for(j=8;j>0;j ){if((i^ccnum)&0x8000) ccnum=(ccnum<<=1)^genpoly;else ccnum<<=1;i<<=1;crc_tble[k]=ccnum;}}void crc_updte(unsigned short dt,unsigned short ccnum)ccnum=(ccnum<<=8)^crc_tble[(ccnum>>8)^dt];}}注:genpoly为CRC多项式,ccnum为累加器值(即为新的CRC值),dt为参与CRC计算的信息。
循环冗余校验编解码电路设计实验报告
循环冗余校验编解码电路设计实验报告一、引言循环冗余校验(CRC)是一种常用于检测和校正数据传输错误的技术。
在通信领域,CRC编解码电路是一种重要的硬件设计,用于验证数据传输的准确性。
本实验旨在通过设计循环冗余校验编解码电路,探索其工作原理和实际应用。
二、背景知识1.循环冗余校验原理循环冗余校验利用多项式除法的性质来实现数据校验。
发送端将数据和校验值进行运算得到余数,并将余数附加到数据后一起发送。
接收端通过对接收到的数据进行除法运算,得到的余数判断数据是否正确。
2.CRC编码过程–发送端:将数据进行扩展,加上用于校验的位数,并使用预定的生成多项式进行除法运算得到余数,将余数附加在数据后面发送出去。
–接收端:接收到数据后,再次进行除法运算,得到的余数为0则说明数据传输正确,否则说明存在错误。
3.CRC解码过程–发送端:发送数据和余数。
–接收端:接收数据和余数,使用与发送端一样的生成多项式进行除法运算,得到的余数判断数据是否正确。
三、实验设计与实现1. 实验目的了解循环冗余校验的原理,并通过设计和实现循环冗余校验编解码电路加深对其理解。
2. 实验器材与材料•FPGA开发板:用于搭建实验电路•Vivado软件:用于设计和验证电路•扁平电缆:用于连接FPGA开发板和外部设备3. 实验步骤1.了解所用的生成多项式,确定校验位数和除法运算方式。
2.使用Vivado软件创建工程,选择适合的FPGA开发板型号。
3.设计循环冗余校验编码模块,并使用Verilog语言进行描述。
4.设计循环冗余校验解码模块,并使用Verilog语言进行描述。
5.设计测试模块,用于生成测试数据和验证结果。
6.进行RTL级仿真,验证电路设计的正确性。
7.将设计文件综合、实现和下载到FPGA开发板。
8.在FPGA开发板上测试编解码电路的功能和性能。
9.分析实验结果,总结经验和教训。
四、实验结果与分析1. RTL级仿真结果在RTL级仿真中,我们生成了不同的输入数据,并通过编解码电路计算得到校验值和余数。
crc循环冗余校验 matlab 实现-概述说明以及解释
crc循环冗余校验matlab 实现-概述说明以及解释1.引言1.1 概述概述部分的内容:CRC(循环冗余校验)是一种在数据通信中常用的差错检测方法。
它通过对发送数据进行一系列的计算和校验,以判断接收数据是否出现了错误或被篡改。
CRC技术广泛应用于各种数据传输系统,包括计算机网络、无线通信、存储设备等。
CRC算法的原理是将发送数据看作一个多项式,并利用这个多项式进行一系列的运算。
通过对多项式进行除法运算,得到一个余数。
发送方将这个余数附加在数据后面发送给接收方。
接收方同样利用CRC算法对接收到的数据进行一系列的运算,得到一个余数。
如果发送方和接收方的余数一致,则可以认为数据传输没有出现错误;反之,如果余数不一致,则说明数据发生了错误或被篡改。
Matlab是一种功能强大的科学计算软件,也是进行CRC算法实现的优秀工具。
通过Matlab的计算和编程能力,我们可以方便地编写CRC算法的相关代码,实现CRC校验的过程。
Matlab提供了各种函数和工具箱,可以帮助我们进行多项式的运算、二进制数据的转换以及CRC校验码的计算等操作。
本篇文章将详细介绍如何在Matlab中实现CRC循环冗余校验。
首先,我们将介绍CRC算法的基本原理和步骤。
然后,我们将详细讲解如何使用Matlab进行CRC校验的编程实现,包括数据的转换、多项式的计算和余数的检验。
最后,我们将通过实际的案例来展示Matlab实现CRC的应用场景和效果。
通过阅读本文,读者将能够了解CRC循环冗余校验的基本原理和应用场景,并能够使用Matlab进行CRC算法的实现和应用。
本文的内容将有助于读者提高对CRC技术的理解和掌握,在进行数据通信和差错检测的相关工作中发挥更好的作用。
文章结构部分应该涵盖关于整篇文章章节的简要说明,以下是一种可能的编写方式:1.2 文章结构本文共分为三个主要部分:引言、正文和结论。
每个部分的内容如下所述:1. 引言在引言部分,我们将首先对文章所涉及到的主题进行概述,包括简要介绍循环冗余校验(CRC)的概念和应用领域。
crc16 原理
crc16 原理CRC16是循环冗余校验的一种算法,能够对数据进行快速、简单的校验,广泛应用在数据通信和存储领域。
本文将详细介绍CRC16的原理和应用。
1. CRC16是什么?CRC16是循环冗余校验的一种算法,它将数据通过特定的计算方式转换为一个16位的校验值。
发送方可以将这个校验值附加在数据中一起发送给接收方,接收方则通过对收到的数据再次进行CRC16计算,并与附加的校验值进行比较,从而检测数据是否在传输或存储过程中出现错误或损坏。
2. CRC16原理CRC16算法使用了多项式除法的思想。
具体步骤如下:2.1初始化将CRC寄存器初始化为一个预设值(通常为全1或全0),这个值决定了CRC16算法的种类。
2.2数据处理将数据依次按位放入CRC寄存器,从高位到低位进行处理。
处理的方式是将CRC寄存器的高位与数据位进行异或操作,然后再将结果右移一位。
如果异或操作后的最高位为1,则还需要与一个预设的多项式进行异或操作。
2.3重复处理重复以上的数据处理步骤,直到所有数据位都经过处理。
2.4结果输出处理完所有数据位后,CRC寄存器中存储的就是CRC16校验值。
可以将其作为一个附加的校验字节与原数据一起发送给接收方。
3. CRC16的应用CRC16算法具有快速、简单的特点,广泛应用于各种通信和存储系统中,包括但不限于以下几个领域:3.1数据通信在数据通信中,发送方通过对发送的数据进行CRC16计算,将CRC16校验值附加在数据中一起发送给接收方。
接收方接收到数据后,再次进行CRC16计算,将计算得到的校验值与附加的校验值进行比较,如果相等,则认为数据传输正确无误;如果不相等,则说明数据在传输过程中出现错误或损坏。
3.2存储校验在存储系统中,CRC16算法可以用于对数据进行校验,以确保数据的完整性和一致性。
在数据写入存储介质之前,计算数据的CRC16校验值并将其存储。
当数据被读取时,再次计算数据的CRC16校验值,并将计算得到的校验值与存储的校验值进行比较,从而检测数据是否损坏或被篡改。
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)的基本原理是:在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)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。
通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。
编辑本段几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。
可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。
多项式包括生成多项式G(x)和信息多项式C(x)。
如生成多项式为G(x)=x^4+x^3+x+1,可转换为二进制数码11011。
而发送信息位 1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。
2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。
在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:a、生成多项式的最高位和最低位必须为1。
b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
c、不同位发生错误时,应该使余数不同。
d、对余数继续做除,应使余数循环。
3 CRC码的生成步骤1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当与对应的信息多项式C(x)*2的R次方。
3、用生成多项式(二进制数)对信息码做除,得到R位的余数。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
crc原理
crc原理
CRC(Cyclic Redundancy Check)是一种在计算机网络中常用的错误检测方法,它通过对数据进行循环冗余校验,来检测数据在传输过程中是否发生了错误。
CRC原理的核心是利用多项式除法来实现对数据的校验,下面我们将详细介绍
CRC的原理和实现方法。
首先,CRC的计算过程是将要传输的数据看作一个二进制多项式,然后利用除法运算来生成校验码。
具体步骤如下,首先选择一个固定的生成多项式,然后将要传输的数据与生成多项式进行模2除法运算,得到余数作为校验码。
在接收端,同样利用相同的生成多项式对接收到的数据进行除法运算,如果余数为0,则说明数
据传输正确,否则说明数据存在错误。
其次,CRC的实现方法包括两种常用的方式,硬件实现和软件实现。
硬件实现是通过专门的CRC芯片来实现数据的校验,速度快,但成本较高。
软件实现则是
通过计算机程序来实现CRC校验,相对较慢但成本较低,适用于软件开发领域。
此外,CRC校验的优点是可以检测多种类型的错误,包括单比特错误、双比特错误以及所有奇数个比特错误。
而且CRC校验的计算效率高,适用于大规模数据
的传输和存储。
最后,需要注意的是CRC校验并不能纠正数据错误,它只能检测出数据是否
存在错误。
因此在实际应用中,通常会结合其他纠错编码方法来提高数据传输的可靠性。
总之,CRC是一种高效的数据校验方法,通过多项式除法来实现对数据的校验,具有检测多种错误类型、计算效率高的优点。
在计算机网络和数据存储领域得到了广泛的应用。
希望本文能够帮助读者更加深入地理解CRC的原理和实现方法。
CRC校验原理及实现
随着数据采集系统的功能日益强大,以及微型计算机的普及,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。
特别是在大规模高精度数据采集系统中,对数据进行分析和计算将占用很大一部分单片机的资源,可以将采集到的数据通过串行通讯方式传送给PC机,由PC机来完成数据的处理工作。
但是由于传输距离、现场状况等诸多可能出现的因素的影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。
为了防止错误所带来的影响,在数据的接收端必须进行差错校验。
虽然差错校验也可以完全由硬件来承担,但由于单片机和PC都具有很强的软件编程能力,这就为实施软件的差错校验提供了前提条件,而软件的差错校验有经济实用并且不增加硬件开销的优点。
本文就是基于多功能应变测试系统而编写的主机和单片机之间的RS-485通讯系统,介绍了一种软件差错校验方案循环冗余差错校验法。
1 CRC法的原理传统的差错检验法有:奇偶校验法,校验和法,行列冗余校验法等。
这些方法都是在数据后面加一定数量的冗余位同时发送出去,例如在单片机的通讯方式2和3中,TB8就可以作为奇偶校验位同数据一起发送出去,在数据的接收端通过对数据信息进行比较、判别或简单的求和运算,然后将所得和接收到的冗余位进行比较,若相等就认为数据接收正确,否则就认为数据传送过程中出现错误。
但是冗余位只能反映数据行或列的奇偶情况,所以这类检验方法对数据行或列的偶数个错误不敏感,漏判的概率很高。
因此,此种方法的可靠性就差。
循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。
它是利用除法及余数的原理来作错误侦测(Error Detecting)的。
实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CR C值不同,则说明数据通讯出现错误。
由于这种方法取得校验码的方式具有很强的信息覆盖能力,所以它是一种效率极高的错误校验法。
计算机循环冗余校验算法分析
计算机循环冗余校验算法分析【摘要】计算机循环冗余校验算法(CRC)是一种常用于数据传输中的错误检测技术。
本文首先介绍了CRC算法的原理与特点,包括通过计算数据的余数来检测传输中的错误。
接着探讨了CRC算法在通信、存储等领域的广泛应用,并详细描述了CRC算法的实现方式,包括选择多项式和生成校验码等步骤。
对CRC算法的性能进行了评估,包括检测能力和误差检测率等指标。
分析了CRC算法的优缺点,指出其高效性和稳定性,但也存在计算复杂度高和容易受到干扰的缺点。
CRC算法在实际应用中具有重要意义,需要在平衡性能和成本的基础上进行合理选择和应用。
【关键词】计算机、循环冗余校验算法、CRC算法、原理、特点、应用领域、实现方式、性能评估、优缺点、分析、结论1. 引言1.1 计算机循环冗余校验算法分析计算机循环冗余校验算法(CRC)是一种常用于数据传输中的错误检测算法。
通过对数据进行特定的计算和校验,可以有效地检测传输过程中是否存在数据损坏或错误,保证数据的完整性和准确性。
在计算机网络、存储系统、通信设备等领域广泛应用。
CRC算法的原理是利用多项式除法的原理,通过生成一个循环冗余校验码,并将其附加到数据末尾。
接收端根据相同的生成多项式对接收到的数据进行计算,如果计算结果为0,则认为数据传输正确;如果计算结果不为0,则表示数据损坏或错误。
CRC算法的实现方式通常使用硬件电路或软件算法来实现。
硬件实现速度快,但成本较高;软件实现灵活,适用范围广。
性能评估方面,CRC算法在数据传输的可靠性和效率方面表现优异,能够有效检测出大多数错误。
优点包括高效的错误检测能力和简单的实现方式,缺点则是无法纠正错误,只能检测错误。
综合来说,CRC算法在数据传输中发挥着重要作用,是保证数据安全和可靠性的重要手段。
的研究和应用将会在未来得到更广泛的发展和应用。
2. 正文2.1 CRC算法的原理与特点CRC算法是一种常用的循环冗余校验算法,它通过对数据进行除法运算来生成校验码,以检测数据传输中的错误。
STM32的软硬件CRC性能比较研究
STM32的软硬件CRC性能比较探究引言:随着嵌入式系统的广泛应用,对数据安全和完整性的要求也越来越高。
CRC(循环冗余校验)是一种常用的校验算法,常被用于数据传输过程中检测错误。
STM32是一系列由STMicroelectronics开发的32位嵌入式微控制器,提供了软件CRC和硬件CRC两种实现方式。
本文将对STM32的软硬件CRC性能进行比较探究,旨在援助开发者选择合适的CRC实现方式。
一、CRC概述1.1 CRC原理循环冗余校验(CRC)是一种纠错编码技术。
数据传输的过程中,发送方利用CRC算法对数据进行运算得到校验码,附加在数据报文的末尾发送。
接收方在接收到数据后,同样利用CRC 算法对数据进行运算得到校验码,并与接收到的校验码进行比对。
若果两者一致,则说明数据传输无误。
否则,则存在数据传输错误。
1.2 CRC应用CRC广泛应用于串行通信、存储系统、网络协议、信号处理等领域。
通过使用CRC校验,可以检测并纠正数据在传输过程中产生的任何错误。
二、软件CRC2.1 软件CRC实现原理软件CRC是通过软件算法实现的。
软件CRC算法按照生成多项式对数据进行处理,最终得到校验码。
STM32提供了多种软件CRC实现方式,包括Bit by Bit、Table Lookup和Table Lookup with Memorized Pre-existing Remainders。
2.2 软件CRC性能特点相比于硬件CRC,软件CRC具有如下特点:(1)灵活性:软件CRC可以灵活选择生成多项式,并依据需要进行修改和调整。
(2)占用资源少:软件CRC的实现一般只需要使用少许的RAM和Flash资源。
(3)适用范围广:软件CRC可以在全部的STM32系列微控制器上使用。
三、硬件CRC3.1 硬件CRC实现原理硬件CRC是通过硬件模块实现的。
硬件模块直接处理输入数据,并生成校验码。
STM32的硬件CRC模块支持多种生成多项式,可以直接调用。
循环冗余校验码的原理及应用
11001 1100110000 11001 10000 11001 1001
1100111001 。
8
2013年7月28日星期日
接收方校验方案
接收方 校验方案
方案一:直接 用接收到的序 列除以生成多 项式G(x),如 果余数R’(x) = 0,则证明传 输正确。
2013年7月28日星期日
CRC-16 :x16+x15+x2+1 CRC-CCITT :x16+x12+x5+1 CRC-32 :x32+x26+x23+x22+x16+x12 + x11+x10+x8+x7+ x5+ x4+ x2+x+1
2013年7月28日星期日
10
CRC软件实现过程
1.MFC仿真界面及功能介绍
基于MFC的CRC-4的算法
方案二:提取接 收到序列的信息 码元,重复发送 方的操作xrM(x) ,再除以生成多 项式G(x),如果 余数R’(x) = R(x),则证明传 输正确。
9
生成多项式 G(x) 的国际标准
CRC-8 : x8+x2+x+1
CRC-10 : x10+x9+x5+x4+x2+1
CRC-12 :x12+x11+x3+x2 +x+1
3. 所有链路层或 网络接口层协 议中,例如 HDLC、DDCMP 等众多领域。
易于实现
2013年7月28日星期日
4
CRC原理
将待发送的位串看成系数为 0 或 1 的多项式;
Java中循环冗余校验(CRC32)的实现
Java中循环冗余校验(CRC32)的实现前⾔本⽂主要给⼤家介绍了关于Java实现循环冗余校验(CRC32)的相关内容,分享出来供⼤家参考学习,下⾯话不多说了,来⼀起看看详细的介绍吧。
CRC32简介CRC校验实⽤程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采⽤检错的⼿段。
在诸多检错⼿段中,CRC是最著名的⼀种。
CRC的全称是循环冗余校验。
CRC32检错能⼒极强,开销⼩,易于⽤编码器及检测电路实现。
从其检错能⼒来看,它所不能发现的错误的⼏率仅为0.0047%以下。
从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等⽅式。
因⽽,在数据存储和数据通讯领域,CRC⽆处不在:著名的通讯协议X.25的FCS(帧检错序列)采⽤的是CRC-CCITT,ARJ、LHA等压缩⼯具软件采⽤的是CRC32,磁盘驱动器的读写采⽤了CRC16,通⽤的图像存储格式GIF、TIFF等也都⽤CRC作为检错⼿段。
CRC实现package com.jianggujin.codec;import java.io.IOException;import java.io.InputStream;import java.util.zip.CRC32;/*** CRC32** @author jianggujin**/public class HQCRC32{private static HQCRC32 crc32 = new HQCRC32();public static HQCRC32 getInstance(){return crc32;}private HQCRC32(){}private static final int STREAM_BUFFER_LENGTH = 1024;public long encrypt(byte[] data){CRC32 crc32 = new CRC32();crc32.update(data);return crc32.getValue();}public long encrypt(InputStream data) throws IOException{final byte[] buffer = new byte[STREAM_BUFFER_LENGTH];int read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);CRC32 crc32 = new CRC32();while (read > -1){crc32.update(buffer, 0, read);read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);}return crc32.getValue();}}测试代码:import org.junit.Test;import com.jianggujin.codec.HQCRC32;public class CRC32Test{HQCRC32 crc32 = HQCRC32.getInstance();@Testpublic void encode(){byte[] data = "jianggujin".getBytes();long result = crc32.encrypt(data);System.err.println(result);}}测试结果:724585211总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
pcie ecrc原理
pcie ecrc原理
PCIe ECRC(端到端循环冗余校验)是一种用于PCI Express总
线的错误检测和校正机制。
它的原理是在数据传输过程中对数据进
行CRC(循环冗余校验)计算,并将结果附加到传输的数据中。
当
接收端收到数据时,它会重新计算CRC,并将结果与发送端附加的CRC进行比较,以检测数据是否在传输过程中发生了错误。
这种机制可以有效地检测数据传输过程中的错误,包括位翻转、噪声干扰等。
如果接收端计算出的CRC与发送端附加的CRC不匹配,就意味着数据在传输过程中发生了错误,接收端可以请求重新传输
数据或者进行其他错误处理操作。
PCIe ECRC的原理是通过CRC计算和比较来实现数据传输的可
靠性和完整性。
它可以帮助系统在数据传输过程中及时发现并纠正
错误,提高系统的可靠性和稳定性。
除了以上介绍的原理外,还可以从硬件实现、软件支持、性能
影响等方面对PCIe ECRC进行全面的讨论。
硬件实现方面可以包括ECRC生成和校验电路的设计和实现,软件支持方面可以包括驱动程
序和操作系统对ECRC的支持程度,性能影响方面可以包括ECRC对
系统性能的影响等。
综上所述,PCIe ECRC的原理是通过CRC计算和比较来实现数据传输的可靠性和完整性,它在硬件实现、软件支持和性能影响等方面都有着重要的作用。
循环冗余校验方式
循环冗余校验方式是一种常见的数据检验技术。
它利用一组预定义的生成多项式将数据流转化为一个校验和,然后将校验和附加到数据流末尾。
在接收端,接收器使用相同的生成多项式计算接收到的数据,如果计算出的校验和与发送端的相同,则认为数据传输成功。
在本文中,我们将探讨的原理、实现及应用。
一、原理的原理可以通过一个简单的例子来理解。
假设存在如下数据流:10101100我们使用生成多项式G(x)=x^3+x^2+1来计算它的校验和。
首先,在数据流后面添加三个0,以匹配生成多项式的次数,得到:10101100000然后,我们用生成多项式G(x)去除这个数据流,得到余数,将它作为校验和,附加在数据流的结尾,得到最终的数据流:10101100110接收端收到数据流后,使用相同的生成多项式进行计算,如果计算出的校验和与发送端的相同,则认为数据流传输成功。
二、实现可以通过硬件或软件来实现。
在使用硬件的情况下,可以使用现成的芯片或者设计专门的电路来完成;在使用软件实现的情况下,可以使用现成的库或者自己编写代码来完成。
下面是一个使用Python语言实现循环冗余校验的示例代码:def crc(data, gen):data = bytearray(data)gen = bytearray(gen)data += bytearray(len(gen) - 1)for i in range(len(data) - len(gen) + 1):for j in range(len(gen)):data[i + j] ^= gen[j]return bytes(data[-len(gen) + 1:])在这个代码中,我们定义了一个crc函数,它接收两个参数,一个是数据流,一个是生成多项式。
我们将数据流转化为一个字节数组,然后向这个字节数组的末尾添加与生成多项式位数相同的0。
接下来,我们循环处理字节数组,每次将生成多项式与字节数组的子集异或,直到处理完毕。
CRC校验原理
CRC校验原理1.CRC简介CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常⽤的检错⽅法,⽤于保证数据传输的可靠性。
⽹上有关这⽅⾯的博客和资料很多,本⽂尽量简洁的梳理⼀下它的原理。
后⾯还会结合⾃⼰的实践经验(不多),说⼀说如何使⽤verilog语⾔在FPGA中做CRC校验。
感兴趣的朋友可以关注我后续的更新,⼀起交流学习!CRC校验的基本思路是数据发送⽅发送数据之前,先⽣成⼀个CRC校验码,可以是单bit也可以是多bit,并附在有效数据末尾,以串⾏⽅式发送到接收⽅。
接收⽅接收到数据后,进⾏CRC校验,根据校验结果就可以知道数据是否有误。
CRC校验码的⽣成:将有效数据扩展后作为被除数,使⽤⼀个指定的多项式作为除数,进⾏模⼆除法,得到的余数就是校验码。
数据接收⽅的CRC校验:将接受的数据(有效数据+CRC校验码)扩展后作为被除数,⽤指定的多项式作为除数,进⾏模⼆除法,得到余数为0,则表⽰校验正确。
2.CRC校验过程2.1多项式选取多项式关系到检查错误的可靠性,其中有⼀定的数学关系,这⾥不去深究,感兴趣的朋友可查阅通信原理和线性编码相关书籍。
多项式的常规表达式:G(x)=x^n+x^(n-1)…+1,其中n>=1。
也可以⽤2进制数表⽰,以便软件编程。
例如多项式G(x)=x^5+x^3+x^2+1,⽤2进制表⽰就是101101;多项式G(x)=x^6+x^5+x^1+1,⽤2进制表⽰就是1100011。
很容易看出规律吧。
有些资料⾥将多项式最⾼位的1省略,不过这⾥建议⼿动计算时保留这⼀位,免得出错。
通信领域有⼀些常⽤的多项式,如下表⽰所⽰,可根据通信⽅式选择,例如CRC-5/USB算法对应的是⽤于USB通信的CRC多项式。
2.2求余数(发送⽅)求余⽬的是得到CRC校验码。
⾸先将有效数据扩展n位作为被除数,n是多项式的最⾼次幂,例如前⾯的多项式101101最⾼次幂是5(⽐2进制位数少1),则有效数据扩展5位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
循环冗余校验的原理及软件实现
Ξ
葛方晖
(天津职业技术师范学院自动化系,天津300222)摘要:论述了循环冗余校验的数学模型以及编码原理,并给出了软件的实现方法。
关键词:数据通信;信道;循环冗余校验;生成多项式
中图法分类号:TN 911172 文献标识码:A
文章编号:10012456X (1999)0420046203
PR INC IPL E OF CYCL I C RED UNDANCY CHECK
AND S OFT W ARE REAL IZAT I ON
GE Fang -hu i
(T ian jin V ocati onal and T echn ical T eachers’Co llege ,T ian jin 300222Ch ina )
Abstract :T h is paper p resen ts the m athem atical model and coding p rinci p le of cyclic redundancy check ,and show the softw are i m p lem en tati on .
Key words :D ata Comm un icati on ;Channel ;Cyclic R edundancy Check ;Generato r Po lynom ial 在数据通信的过程中,由于信道传输特性不理想和加性噪声的影响,所收到的数字信号不可避免地会受到干扰,严重时发生误码,影响系统的工作。
在接收端为了检查所收到的数据是否正确,可采用多种检错方法。
比如奇偶校验法,校验和法以及行列冗余码校验等,但都有一定缺乏。
本文介绍一种强有力的检错方法,即循环冗余校验,并将其成功地应用于无线测控系统中,收到了令人满意的效果。
1 循环冗余校验的数学模型
循环冗余校验简称循环码或CRC 码(Cyclic R edundancy Check ),是一种高效能的检错和纠错码,在数据通信中应用甚广。
循环码编码通过模2运算来建立信息位和校验位之间的约束关系。
首先将所传数据看成高次多项式,把此多项式除以预先给定的生成多项式,其余数作为校验位附加在所传数据的尾部一并传送,即在一个长度为n 的码组中有k 个信息和r 个校验位。
译码时用同样的生成多项式去除,若余数为零,则可判断收到的数据是正确的。
1999年第4期 天 津 轻 工 业 学 院 学 报JOURNAL OF TI ANJ IN INSTITUTE OF L IGHT IND USTR Y
N o .4 1999Ξ收稿日期:1999208210
3 作者简介:葛方晖(19702),男(汉族),江苏人,讲师,硕士.
假设待编码的k 位信息是: M =(m k -1,m k -2,…,m 2,m 1,m 0)
它所对应的信息多项式是: M (x )=m k -1x
k -1+m k -2x k -2+…+m 2x 2+m 1x +m 0 用x n -k 乘M (x )得:
x n -k M (x )=m k -1x n -1+m k -2x n -2+…+m 2x n -k +2+m 1x n -k +1+m 0x n -k 用给定的(n ,k )循环码生成多项式g (x )除x n -k ・M (x )得:
x n -k ・M (x )=q (x )・g (x )+R (x )
(1)式中q (x )和R (x )分别是除法的商式和余式。
因为生成多项式g (x )是(n -k )次,所以R (x )一定是等于或小于(n -k -1)次,即:R (x )=r n -k -1x n -k -1+r n -k -2x n -k -2+…+r 2x 2+r 1x +r 0
由(1)式得x n -k ・M (x )+R (x )=q (x )・g (x ),上式表明x
n -k ・M (x )+R (x )是g (x )的倍式,其次数等于或小于(n -1)。
所以x n -k ・M (x )+R (x )是g (x )生成的循环码的一个码多项式,把x n -k ・M (x )+R (x )展开得:
x n -k ・M (x )+R (x )=m k -1・x
n -1+m k -2・x n -2+…+2x n -k +2+m 1x n -k +1+m 0x n -k +r n -k -1x n -k -1+r n -k -2x n -k -2
+…+r 2x 2+r 1x +r 0此码多项式对应的码字是:(m k -1,m k -2,…m 2,m 1,m 0,r n -k -1,r n -k -
2…r 2,r 1,r 0)
所以码字是由不加改变的k 位信息码元,其后再附加(n -k )位校验码元组成的。
在接收端,对收到的码字进行译码,即除以g (x )
[x n -k ・M (x )+R (x )] g (x )=[q (x )・g (x )+R (x )+R (x )] g (x )
=q (x )・g (x ) g (x )=q (x )若传输正确,则余数为零,当余数为非零时,判断数据传送有误,以达到数据通信的检错目的。
例如:对于(7,3)循环码,待编码的信息为M =101,生成多项式g (x )=x 4+x 3+x 2+1,则M (x )=x 2+1
x 7-3・M (x )=x 4(x 2+1)=x 6+x 4,其码字为1010000,运用长除法,所以码字为1010011,传送时将信息位与校验位一同发出,在接收方译码时,也采用相同的长除法。
若余数为零,则接收正确。
2 生成多项式g (x )的种类
用于进行CRC 除法的生成多项式有多种,推荐使用的有3种:
(1) CRC 212:用于6位字符的同步系统中,校验码组长12位,生成多项式是 g (x )=x 12+x 11+x 3+x 2+x +1
它能检测出长度在12位以内的突发差错。
(2) CRC 216:用于8位字符的同步系统,校验码组长16位,生成多项式是 g (x )=x 16+x 15+x 2+1
它能检测出全部16位以下和16位长的突发差错,以及99%的长度大于16位的突发差错。
(3) CRC 2CC IT T :也是对8位字符进行计算,产生的校验码组长16位,生成多项式是 g (x )=x 16+x 12+x 5+1
其检错能力同CRC 216。
・74・第4期 葛方晖:循环冗余校验的原理及软件实现
图1 CRC 编码流程图3 CRC 校验的软件实现
在实现循环码的编码时,大体有两种方法,即硬件法和软件法。
硬件法采用除法电路来完成,该除法电路是一个根据生成多项式而形成的带反馈连接的移位寄存器,在很多通信设备中已广泛采用。
但在有些系统中,为了简化硬件设备,往往采用软件的方法来实现。
循环码编码在软件实现过程中,多项式的除法运算是通过右移移位和异或运算来完成的。
在本系统中采用的生成多项式是CRC 216,即g (x )=x 16+x 15+x 2+1。
由于在进行异或运算的过程中,其最高位的运算结果是已知的,即当信息位多项式右移,移出位为“1”时与生成多项式进行异或运算,其运算结果必定为0,因此当信息多项式移出位为“1”时,移出位可不参加运算,生成多项式的最高位也不参加运算,也不需存储,于是两个字节就可以表达一个17比特的生成多项式,所以参与异或运算的生成多项式只用两个字节表示。
对一帧数据进行CRC 编码的软件流程见图1。
流程图中,3字节右移一位操作,是将R 0的最低位移出,R 1的最低位移入R 0的最高位,R 2的最低位移入R 1的最高位,R 2的最高位补0,之所以这样做,是为了保证R 1R 0与#A 001H 异或时,R 1的最高位总是信息位,当右移8次后,R 2中的数值为0,而R 1R 0中为余数,完成一个字节的运算。
此时再取数据区中的下一个数据,送入R 2中,继续上述操作,直到数据长度减为0时为止,R 1R 0中即为CRC 校验位,也就是这一帧数据的余数位。
解码过程与编码过程相似,操作时两个字节的CRC 位不清0,直接参与运算,当信息字节长度减为0时,R 1R 0的值为0,则表示接收正确,否则有误。
需要说明的是,由于右移操作是把信息字节中的最低位当作最高位进行运算,则生成多项式也需按逆序运算,即x 15+x 2+1的16进制形式为(1000000000000101)B =8005H ,其逆序为(1010000000000001)B =A 001H 。
正序和逆序的性质是一样的,使用哪种方式由与之通信的上位机采用何种方式来决定。
参 考 文 献:
[1] 曹志刚1现代通信原理[M ]1北京:清华大学出版社,19921
[2] 徐秉铮1数字通信[M ]1北京:国防工业出版社,19791
[3] 常晓明1CRC 校验及其软件实现[J ]1电子技术应用,1995,(6)1・84・天 津 轻 工 业 学 院 学 报 1999年10月。