CRC校验代码
[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
![[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码](https://img.taocdn.com/s3/m/0bc92025cec789eb172ded630b1c59eef8c79a88.png)
[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码1.CRC、FCS是什么CRC,全称Cyclic Redundancy Check,中⽂名称为循环冗余校验,是⼀种根据⽹络数据包或计算机⽂件等数据产⽣简短固定位数校验码的⼀种信道编码技术,主要⽤来检测或校验数据传输或者保存后可能出现的错误。
它是利⽤除法及余数的原理来作错误侦测的。
FCS,全称Frame Check Sequence,中⽂名称为帧校验序列,俗称帧尾,即计算机⽹络数据链路层的协议数据单元(帧)的尾部字段,是⼀段4个字节的循环冗余校验码。
注:CRC循环冗余校验和FCS帧校验序列是单独的概念,CRC是⼀种错误校验⽅法,FCS是帧尾校验码,FCS可以采⽤CRC校验⽅法,也可以采⽤其他校验⽅法。
2.CRC算法原理我们可以把任意的⼀串⼆进制数据表⽰为⼀个与之对应的多项式。
⽐如:⼆进制数据:1100101多项式:x^6 + x^5 + x^2+1多项式:x^6 + x^4+x^3 + x^2+1⼆进制数据:1011101有了这样的对应关系,对⼆进制数据的CRC校验就可以利⽤多项式运算规则进⾏校验计算。
CRC校验算法正是采⽤了模2除法,在数据处理⾥的具体表现为异或运算。
CRC的具体运算规则为:假设要传输的⼆进制数据为:10010110,对应的m阶多项式为:M =x^7+x^4+x^2+x^1,除数为h阶的多项式为:H=x^4+x,对应的⼆进制码为:10010,先将M乘以x^h,即将M对应的⼆进制数据后⾯加h个0,然后除以h阶的多项式H,得到的h-1阶的余数项R对应的⼆进制数据即为数据10010110的CRC校验码。
3.计算CRC校验3.1.⼿⼯计算CRC校验码M和H的多项式除法运算,可以⽤模2除法运算计算。
下⾯为以⽣成多项式为H求10010110的CRC校验码运算过程:对应到异或运算:通过⽰例即其他⾃定义的⼀些数据运算后,根据运算现象总结可以得到⼀些规律:1.每次异或运算,当从左到右⾸位为1的时候,就与⽣成多项式H异或运算,然后再左移1位;当⾸位为0的时候只将数据左移1位。
crc校验格式

crc校验格式CRC(Cyclic Redundancy Check,循环冗余校验)是一种通过对数据进行除法运算来生成一定位数的校验码的错误检测技术。
CRC 校验的格式通常由以下几个要素组成:1. 生成多项式(Polynomial):- CRC 校验中最关键的部分是生成多项式。
它是一个二进制数,表示为一个二进制数串,通常写成十六进制格式。
生成多项式决定了CRC 校验的性能和检测能力。
2. 初始值(Initial Value):-初始值是生成多项式计算的起始值。
不同的CRC 校验可能有不同的初始值。
3. 异或运算(XOR):-在CRC 校验的计算过程中,经常使用异或运算。
它用于将数据和生成多项式进行按位异或操作,以进行校验码的计算。
4. 末尾补零(Zero Padding):-数据在进行CRC 校验之前,通常需要在末尾补零以确保可以整除生成多项式。
5. 结果异或值(Final XOR Value):- CRC 校验计算完成后,可能会再次进行异或运算,将最终的CRC 校验码与一个特定值进行异或。
CRC 校验的计算步骤一般为:1. 在数据末尾补零。
2. 用生成多项式除以数据。
3. 将余数作为CRC 校验码。
CRC 校验码的长度通常由生成多项式决定,例如,CRC-16 表示校验码长度为16 位。
一些常见的CRC 校验标准包括CRC-16、CRC-32 等。
以下是一个简化的CRC 校验的伪代码示例:```plaintextfunction generateCRC(data, polynomial, initial, finalXOR):remainder = data + "0" * (len(polynomial) - 1) // 补零for bit in data:if remainder[0] == "1":remainder = XOR(remainder[1:], polynomial)remainder = remainder[1:] + bitreturn XOR(remainder, finalXOR) // 最终异或运算function XOR(a, b):result = ""for i in range(len(a)):result += "1" if a[i] != b[i] else "0"return result```上述代码仅用于说明概念,实际的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校验方法用C语言实现源代码

CRC校验方法用C语言实现源代码CRC校验方法,用C语言实现源代码CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单。
用了一天时间研究了CRC的C语言实现,理解和掌握了基本原理和C语言编程。
结合自己的理解简单写下来。
1、CRC简介CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
接收端根据同样的规则校验,以确定传送中是否出错。
接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC 比较,一致则接收正确。
2、计算整个k+r位的CRC码,若为0,则接收正确。
CRC码有多种检验位数,8位、16位、32位等,原理相同。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位,除以一个多项式,最后所得到的余数就是CRC码。
求CRC码所采用的是模2运算法则,即多项式除法中采用不带借位的减法运算,运算等同于异或运算。
这一点要仔细理解,是编程的基础。
CRC-16: (美国二进制同步系统中采用) G(X) = X16 + X15 + X2 + 1 CRC-CCITT: (欧洲CCITT推荐) G(X) = X16 + X12 + X5 + 1 CRC-32: G(X) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1 2、按位计算CRC 采用CRC-CCITT多项式,多项式为0x11021,C语言编程时,参与计算为0x1021,这个地方得深入思考才能体会其中的奥妙,分享一下我的思路:当按位计算CRC时,例如计算二进制序列为1001 1010 1010 1111时,将二进制序列数左移16位,即为1001 1010 1010 1111 (0000 0000 0000 0000),实际上该二进制序列可拆分为1000 0000 0000 0000 (0000 0000 000起对0x11021求余,这一步理解应该没什么问题。
CRC校验通用代码

CRC校验通用代码-lchclass CRCParam{public:CRCParam(int o,unsigned long p,unsigned long i,unsigned long f,bool d,bool ri,bool ro): order(o), polynom(p), initial(i), final(f), direct(d),refin(ri), refout(ro){}int order;unsigned long polynom;unsigned long initial;unsigned long final;bool direct;bool refin;bool refout;};const CRCParam CRCCCITT(16, 0x1021, 0xffff, 0, true, false, false);const CRCParam CRC16(16, 0x8005, 0, 0, true, true, true);const CRCParam CRC32(32, 0x4c11db7, 0xffffffff, 0xffffffff, true, true, true);unsigned long reflect (unsigned long crc, int bitnum){unsigned long i, j = 1, crcout = 0;for (i = (unsigned long)1 << (bitnum - 1); i; i >>= 1){if (crc & i){crcout |= j;}j <<= 1;}return (crcout);}// This code "stolen" from Sven Reifegerste (zorci@gmx.de).// Found at http://rcswww.urz.tu-dresden.de/~sr21/crctester.c// from link at http://rcswww.urz.tu-dresden.de/~sr21/crc.htmlunsigned long computeCRC(const unsigned char *data,unsigned long len,const CRCParam& params){unsigned long i, j, c, bit;unsigned long crc = params.initial;// at first, compute constant bit masks for whole CRC and// CRC high bitunsigned long crcmask = ((((unsigned long)1 << (params.order - 1)) - 1) << 1) | 1;unsigned long crchighbit = (unsigned long)1 << (params.order - 1);if (crc && params.direct){for (i = 0; i < params.order; i++){bit = crc & 1;if (bit){crc ^= params.polynom;}crc >>= 1;if (bit){crc |= crchighbit;}}}for (i = 0; i < len; i++){c = (unsigned long) * data++;if (params.refin){c = reflect(c, 8);}for (j = 0x80; j; j >>= 1){bit = crc & crchighbit;crc <<= 1;if (c & j){crc |= 1;}if (bit){crc ^= params.polynom;}}}for (i = 0; i < params.order; i++){bit = crc & crchighbit;crc <<= 1;if (bit){crc ^= params.polynom;}}if (params.refout){crc = reflect(crc, params.order);}crc ^= params.final;crc &= crcmask;return 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校验是一种错误检测机制,而不是错误纠正机制。
它只能告诉我们数据是否出现错误,而无法纠正错误。
若数据被改变或破坏,则接收方可以要求重新发送数据。
单片机crc16程序

单片机crc16程序CRC(循环冗余校验)是一种校验方法,用于检测数据传输过程中的错误。
CRC16是一种16位的CRC校验算法,常用于单片机和通信协议中。
下面是一个简单的C语言实现的CRC16计算程序示例:c.#include <stdio.h>。
#include <stdint.h>。
#define POLYNOMIAL 0x1021。
uint16_t crc16(uint8_t data, uint16_t length) {。
uint16_t crc = 0;uint8_t i;uint8_t j;for (j = 0; j < length; ++j) {。
crc ^= (uint16_t)(data[j] << 8);for (i = 0; i < 8; i++) {。
if (crc & 0x8000) {。
crc = (crc << 1) ^ POLYNOMIAL; } else {。
crc <<= 1;}。
}。
}。
return crc;}。
int main() {。
uint8_t test_data[] = {0x01, 0x02, 0x03, 0x04,0x05};uint16_t crc = crc16(test_data, sizeof(test_data));printf("CRC16: 0x%04X\n", crc);return 0;}。
在这个示例中,我们定义了一个CRC16函数,它接受一个指向数据的指针和数据长度作为输入,并返回计算得到的CRC16校验值。
在主函数中,我们传入了一个测试数据并打印出计算得到的CRC16值。
需要注意的是,不同的应用场景可能会使用不同的CRC16多项式,所以在实际使用时需要根据具体的需求来选择合适的多项式。
另外,以上代码只是一个简单的示例,实际应用中可能还需要考虑字节序、初始值等因素。
modbus crc校验详解 C代码

(6).重复步骤2到步骤5,进行下一个8位数据的处理;
(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)
*/
/*****************crc校验**********************************************/
wcrc^=temp;//将数据存入crc寄存器
for(j=0;j<8;j++)//循环计算数据的
{
if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。
{
wcrc>>=1;//先将数据右移一位
CRC[1]=wcrc>>8;//crc的高八位
}
unsigned char temp;//定义中间变量
int i=0,j=0;//定义计数
for(i=0;i<len;i++)//循环计算每个数据
{
temp=*ptr&0X00FF;//将八位数据与crc寄存器亦或
ptr++;//指针地址增加,指向下个数据
wcrc^=0XA001;//与上面的多项式进行异或
}
else//如果不是1,则直接移出
{
wcrc>>=1;//直接移出
}
}
}
temp=wcrc;//crc的值
CRC[0]=wcrc;//crc的低八位
//crc生成函数,并将crc存储在预先定于的数组中
//调用方式crc16(指向数据的指针,需要校验的数据长度)