CRC校验算法与实现程序
CRC校验算法及C#程序实现

CRC校验算法及C#程序实现CRC校验可以运用于传输数据过程中的验证,发送端发送有效数据时,先根据有效数据和生成多项式(比如CCITT标准的多项式是X16+X12+X5+1)计算出CRC校验码,把CRC校验码加到有效数据后面一起发送;当接收数据时,取出前面有效数据部分,用同样生成多项式计算出CRC校验码,然后取出接收数据后面CRC校验码部分,对比两个校验码是否相同。
如果相同,认为接收到的数据与发送的数据是一致的,传输正确;如果不同,认为传输数据出错。
CRC(循环冗余校验)算法主要是一个计算除法的过程。
算法有两个输入值,第一个是输入的信号,这通常是一个很长的数据,作为被除数。
第二个是一个与具体的CRC算法相关的多项式,称为生成多项式,用作除数。
基本的计算过程是,两者作模2除法(本质上是对应位做异或运算),余数就是CRC校验码的结果。
I、基本算法(人工笔算):以CRC16-CCITT为例进行说明,它的生成多项式是X16+X12+X5+1,CRC校验码为16位,生成多项式17位。
假如数据流为4字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算(相当于按位异或),所得的余数就是CRC校验码。
发送时的数据流为6字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0];II、计算机算法1(比特型算法):1)将扩大后的数据流(6字节)高16位(BYTE[3]、BYTE[2])放入一个长度为16的寄存器;2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);3)重复第2步,直到数据流(6字节)全部移入寄存器;4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。
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校验算法与实现程序

息码),以一定的规则产生一个校验用的 r 位监督码(CRC 码),附在原始信息后
边,构成一个新的二进制数序列共 k+r 位,然后发送出去。在接收端,根据信
息码和 CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,
在差错控制理论中称为“生成多项式”。
在代数编码理论4
3
2
1
0
项式的系数。例如:1100101 表示为:1・x +1・x +0・x +0・x +1・x +0・x +1・x ,
652
即 x +x +x +1。
设编码前原始信息多项式为 P(x),P(x)的最高次幂加 1 等于 k;生成多项
式为 G(x),G(x)的最高次幂等于 r;CRC 多项式为 R(x);编码后的带 CRC 的信
CRC 校验算法与实现程序
作者:Water Shining 日期:2012-10-28
邮箱:snow1861@
基本原理:
CRC 的全称为 Cyclic Redundancy Check,中文名称为循环冗余校验。利用
CRC 进行检错的过程可简单描述为:在发送端根据要传送的 k 位二进制数序列(信
+(Shift_Register>>1); Shift_Register^=(CRC_Polynomial_Register*temp_long); } //parity for(i=0;i<CRC_Parity_Bits_Number;i++) { temp_long=Shift_Register&0x1; Shift_Register>>=1; Shift_Register^=(CRC_Polynomial_Register*temp_long); } //convert parity variable to binary data for(i=0;i<CRC_Parity_Bits_Number;i++) CRC_ParityBits[i]=((Shift_Register>>i)&0x1); } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// unsigned int BinaryDataIn[11]={1,1,0,0,1,0,1}; unsigned int CRC_ParityBits[CRC_Parity_Bits_Number]; void main(void) { //generat CRC parity CRC_ParityBits_Generator(BinaryDataIn,7,CRC_ParityBits); //a break point put here }
crc校验实例

crc校验实例本文介绍了CRC(循环冗余校验)校验算法及其实例。
CRC是一种在数据传输过程中常用的校验方式,其基于多项式计算,通过生成冗余的比特序列来实现数据完整性的验证。
CRC可以检测出数据在传输过程中是否发生了错误或篡改。
本文将以一个简单的实例来介绍CRC校验的实现过程。
1. CRC校验算法的基本原理在传输数据时,常常会发生数据出现差错或者被人恶意篡改的情况,一旦出现这种情况,就会使得接收方的结果出错、含义歧义、甚至数据完全失效。
而CRC在数据传输期间可以帮助检测出这种变化,从而确保数据的完整性和正确性。
CRC校验可以通过一个多项式来实现。
假设数据D以二进制形式传输,那么CRC校验就是生成一个比特序列,然后与D拼接在一起,形成了一个长的二进制序列S。
然后S被除以一个特定的多项式P,并令余数为R。
根据CRC算法的定义,如果数据D正确接收到,那么R应该等于0。
也就是说,如果接收到的数据D出现错误,那么P就无法整除S,余数R也不等于0。
这样,接收方就可以根据R的值来判断数据是否正确。
2. CRC校验的实现过程下面,我们将通过一个简单的例子来介绍CRC校验的具体实现步骤。
我们假设要发送的数据为1001011,设计的多项式为1011。
因此,接收方会接收到101101010,其中最后三位000是CRC校验码。
a. 将1011(多项式)左移三位,即得到1011000。
b. 在1001011的最后加入三个0,得到1001011000c. 将1001011000除以1011,得到商10001000,余数011。
d. 将余数011拼接到1001011后面,即得到了完整的传输数据1001011011,其中最后三位为CRC校验码011。
接收方收到1001011011后,对其进行同样的计算,如果得到的余数不为0,则说明数据出现了错误。
3. CRC校验的应用场景CRC校验常常用于网络传输数据的数据完整性验证。
例如,当一个文件在Internet上传输时,发送方将计算出文件的CRC值并将其附加到文件末尾。
CRC校验原理及实现

CRC校验原理及实现CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测技术,用于检测数据传输过程中的错误。
它通过使用一个或多个生成多项式来计算数据的校验值,然后将校验值添加到数据末尾传输。
接收方将使用相同的生成多项式来计算接收到的数据的校验值,并将其与接收到的校验值进行比较,如果不匹配,则说明数据存在错误。
CRC校验的核心原理是多项式除法,其中数据位被视为多项式的系数,并且我们可以使用位运算来表示多项式除法。
CRC校验使用的生成多项式通常是固定的,并被称为CRC多项式。
生成多项式的选择对于CRC校验的性能非常关键。
常用的CRC多项式包括CRC-16、CRC-32等。
实现CRC校验的步骤如下:1.选择一个适当的CRC多项式。
这个选择取决于应用的特定要求和标准。
2.将CRC初始值设为0。
3.将待传输的数据的每一个字节按位表示为一个多项式,并将他们连接成一个多项式。
4.对于每一个数据字节,将多项式除以CRC多项式。
可以使用位运算来进行除法运算。
5.将余数作为CRC多项式的系数与下一个数据字节连接形成一个新的多项式,并继续除法运算。
6.对于最后一个数据字节,除法完成后会有一个最终的余数。
将这个余数作为校验值。
7.在传输数据时,将校验值附加到数据的末尾。
8.接收方通过接收到的数据和附加的校验值进行相同的CRC校验过程。
9.接收方计算得到的校验值与接收到的校验值比较,如果相同,则数据传输正确;如果不同,则数据传输存在错误。
CRC校验具有高效、可靠和简单的特点。
它可以检测到大部分单比特错误和多比特错误。
然而,CRC校验只能检测错误,而不能纠正错误。
所以在实际应用中,通常需要结合其他的纠错方法,如重传机制,以确保数据传输的可靠性。
总结起来,CRC校验是一种常用的错误检测技术,利用多项式除法计算数据的校验值。
实现CRC校验需要选择适当的CRC多项式,并进行多次除法运算,然后将计算得到的校验值附加到数据末尾进行传输。
CRC校验算法原理及C语言实现(1)

while(len--)
{
//把字符串分为每个字节处理的数学理论基础:
//a xor b=a+b=a-b
//word=byte_h + byte_l,例word=0xABCD,byte_h=0xAB00,byte_l=0x00CD
//word xor b=(byte_h+byte_l)xor b=byte_h xor b xor byte_l ;//因此字符串可以按字节处理,并把上一字节的处理结果
{
unsigned short reg_crc;
unsigned short s_crcchk;
s_crcchk = 0;
reg_crc = 0xffff; //CRC预设
//CRC预设,CRC预设值一般为全或全,预设值不同,CRC结果也不同;另外,正向算法和逆向算法的CRC结果也不同
//每次从字符串里取最高位字节与CRC寄存器异或后回存到CRC寄存器,然后根据CRC寄存器最高位进行操作
{//循环处理字节中的每一位
if(reg_crc & 0x01)//低位在前,高位在后(低位----高位)
{//余式高位为
//reg_crc = (reg_crc >> 1)^0xa001;
reg_crc >>=1;
reg_crc = reg_crc^poly;
}
else
{//余式高位为(与异或保持不变)
{
unsigned long Table_CRC[256]; // CRC 表
unsigned long i;
unsigned short nAccum = 0;
BuildTable16( aPoly, Table_CRC ); //创建CRC表
crc校验原理及代码

crc校验原理及代码CRC(循环冗余校验)是一种错误检测技术,通过对数据进行计算和比较,来确定数据是否被改变或破坏。
它主要用于数据通信中,确保数据的完整性。
CRC校验的原理是通过生成多项式来计算发送数据的校验码,并将校验码附加到数据末尾,接收方通过再次计算校验码来验证数据的完整性。
CRC采用二进制多项式除法的方式实现。
以下是一种常见的CRC校验算法,称为CRC-32算法,它使用32位的校验码:```pythondef crc32(data):crc = 0xFFFFFFFFfor byte in data:crc ^= bytefor _ in range(8):if crc & 1:else:crc >>= 1crc ^= 0xFFFFFFFFreturn crc```利用以上的代码,可以计算给定数据的CRC-32校验码。
下面是代码的解释:1. `crc32`函数的输入参数是字符串类型的数据。
2. `crc`变量初始值为0xFFFFFFFF,是32位全1的二进制数。
3.循环遍历输入数据中的每个字节,并进行计算。
4. `crc ^= byte`将校验码与当前字节进行异或操作。
5.在每个字节的8位中,循环判断最低位是否为17.若最低位为0,则直接右移一个位置。
8.在全部字节处理完成后,将校验码与0xFFFFFFFF进行异或操作,得到最终的校验码。
CRC校验在数据通信中非常常见,特别是在网络传输和存储媒介上。
它可以帮助检测传输过程中发生的位错误,提高数据的可靠性和完整性。
需要注意的是,CRC校验是一种错误检测机制,而不是错误纠正机制。
它只能告诉我们数据是否出现错误,而无法纠正错误。
若数据被改变或破坏,则接收方可以要求重新发送数据。
CRC校验原理及步骤

CRC校验原理及步骤CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,用于验证数据传输过程中是否存在错误。
CRC校验采用生成多项式对数据进行计算,从而生成一个固定长度的冗余校验码,将该校验码附加在数据后面进行传输,接收方利用同样的生成多项式对接收到的数据进行计算,并与接收到的校验码进行比较,如果校验码一致,则认为数据传输没有错误;如果校验码不一致,则认为数据传输存在错误。
1.选择生成多项式:在进行CRC校验前,需要选择一个生成多项式。
常用的生成多项式有:CRC-8,CRC-16,CRC-32等。
根据实际情况选择不同的生成多项式。
2.数据填充:在数据的末尾添加一组"0",长度等于生成多项式的次数加1、例如,如果选择的生成多项式为CRC-8,则在数据末尾填充一组"0",长度为9;如果选择的生成多项式为CRC-16,则在数据末尾填充一组"0",长度为173.生成校验码:利用生成多项式对填充后的数据进行除法运算,计算余数。
余数即为校验码。
通常,余数的位数为生成多项式的次数。
4.将校验码添加到数据中:将生成的校验码添加到数据末尾,并进行传输。
5.接收方计算校验码:接收方接收到数据后,利用接收到的数据和相同的生成多项式进行除法运算,计算余数。
6.比较校验码:接收方得到余数后,将其与接收到的校验码进行比较。
如果两者一致,则认为数据传输没有错误;如果两者不一致,则认为数据传输存在错误。
CRC校验的原理是利用多项式除法运算,将数据作为一个伪多项式进行计算,并得到一个余数。
由于多项式的特性,如果在数据传输过程中出现了错误,那么接收方计算得到的余数一定与发送方生成的校验码不一致。
通过比较余数和校验码,接收方可以判断数据是否传输正确。
1.简单高效:CRC校验算法计算速度快,适用于高速数据传输。
2.安全性高:CRC校验算法能够高效地检测出多种错误,包括单比特错误、双比特错误等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
+(Shift_Register>>1); Shift_Register^=(CRC_Polynomial_Register*temp_long); } //parity for(i=0;i<CRC_Parity_Bits_Number;i++) { temp_long=Shift_Register&0x1; Shift_Register>>=1; Shift_Register^=(CRC_Polynomial_Register*temp_long); } //convert parity variable to binary data for(i=0;i<CRC_Parity_Bits_Number;i++) CRC_ParityBits[i]=((Shift_Register>>i)&0x1); } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// unsigned int BinaryDataIn[11]={1,1,0,0,1,0,1}; unsigned int CRC_ParityBits[CRC_Parity_Bits_Number]; void main(void) { //generat CRC parity CRC_ParityBits_Generator(BinaryDataIn,7,CRC_ParityBits); //a break point put here }
码全部输入(包括左移 r 位后补上的 r 个零),最后存放在移位寄存器中的值就
是校验码(0010)了,即 b3=0,b2=1,b1=0,b0=0。
00001101110 10011/000011001010000
00000 00001 00000
00011 00000
00110 00000
01100 00000
名称
生成多项式
简记式
4
CRC-4
x +x+1
0x3
CRC-12
12 11 3
x +x +x +x+1
CRC-16
16 12 2
x +x +x +1
0x1005
CRC-ITU
16 12 5
x +x +x +1
0x1021
32 26 23
2
CRC-32 x +x +x +…+x +x+1 0x04C11DB7
CRC_Polynomial_Register<<=1; CRC_Polynomial_Register+=(((unsigned long)CRC_Generator_Polynomial>>i)&0x01); } //CRC loop for(i=0;i<BinaryDataIn_Length;i++) { temp_long=Shift_Register&0x1; Shift_Register=(((unsigned long)(BinaryDataIn[i]&0x1))<<(CRC_Parity_Bits_Number-1))
xr・P(x)除以
G(x),如图
1
所示,图中是按照模
2
和进
行的,即 0+0=0,1+0=1,1+1=0,0-1=1,仔细观察图 1 的计算规律,可以用图
2 所示的除法电路来实现,除法电路的主体由一组移位寄存器和模 2 加法器(异
或单元)组成,图 1 中加底纹的数字代表移位寄存器中暂时存放的值。当所有的
r
息多项式为 T(x)。发送方编码方法:将 P(x)乘以 x (即对应的二进制数序列左 移 r 位),再除以 G(x),所得余式即为 R(x),用公式表示为 T(x)=xr・P(x)+R(x);
接收方解码方法:将 T(x)除以 G(x),如果余数为 0,则说明传输中无错误发生,
否则说明传输有误。常见的生成多项式如表格 1 所示。
息码),以一定的规则产生一个校验用的 r 位监督码(CRC 码),附在原始信息后
边,构成一个新的二进制数序列共 k+r 位,然后发送出去。在接收端,根据信
息码和 CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,
在差错控制理论中称为“生成多项式”。
在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多
6
5
4
3
2
1
0
项式的系数。例如:1100101 表示为:1・x +1・x +0・x +0・x +1・x +0・x +1・x ,
652
即 x +x +x +1。
设编码前原始信息多项式为 P(x),P(x)的最高次幂加 1 等于 k;生成多项
式为 G(x),G(x)的最高次幂等于 r;CRC 多项式为 R(x);编码后的带 CRC 的信
11001 10011
10100 10011
01111 00000
11110 10011
11010 10011
10010 10011
00010 00000
0010 图 1 竖式除法
1 input
b0
1
b1
0
b2
图 2 硬件除法
0
b3
C 语言程序:
#define CRC_Parity_Bits_Number 4 #define CRC_Generator_Polynomial 0x3 //CRC-4,g(x)=x4+x+1 void CRC_ParityBits_Generator(unsigned int*BinaryDataIn,unsigned int BinaryDataIn_Length,
32 28 27
86
CRC-32c x +x +x +…+x +x +1 0x1EDC6F41
应用举例 ITU G.704
IBM SDLC ISO HDLC,PPP-FCS ZIP,RAR,PPP-FCS
SCTP
表 1 常见生成多项式及其应用
说明:生成多项式的最高幂次项系数是固定的 1,故在简记式中,将最高的 1 统
CRC 校验算法与实现程序
作者:Water Shining 日期:2012-10-28
邮箱:snow1861@
基本原理:
CRC 的全称为 Cyclic Redundancy Check,中文名称为循环冗余校验。利用
CRC 进行检错的过程可简单描述为:在发送端根据要传送的 k 位二进制数序列(信
unsigned int*CRC_ParityBits) {
unsigned int i; unsigned long Shift_Register=0; unsigned long CRC_Polynomial_Register=0,temp_long; //CRC_Generator_Polynomial bit reverse for(i=0;i<CRC_Parity_Bits_Number;i++) {
一去掉了,如 04C11DB7,实际上是 104C11DB7。
举例说明:设需要编码的二进制数序列(信息码)为 1100101,共 k=7 个 bit,
生成多项式为
10011ቤተ መጻሕፍቲ ባይዱ即
r=4,也就是
652
P(x)=x +x +x +1,G(x)=
x4+x+1,xr・P(x)=
10 9 6 4
x +x +x +x ,下面计算