CRC校验代码
- 格式:doc
- 大小:49.50 KB
- 文档页数:2
[技术栈]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(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校验方法用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校验通用代码-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-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程序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多项式,所以在实际使用时需要根据具体的需求来选择合适的多项式。
另外,以上代码只是一个简单的示例,实际应用中可能还需要考虑字节序、初始值等因素。
crc校验代码
CRC校验代码(Cyclic Redundancy Check)是一种数据校验技术,用于检查传输过程中发生的数据丢失或者错误。
它通过将数据和一个特定的多项式进行运算,来生成一个位序列,这个位序列就是校验码,也就是CRC。
当原始数据在传输过程中出现错误时,校验码也会随之改变,可以使用这个校验码来验证数据是否正确。
CRC校验代码具有位冗余和广泛应用两个特点。
它可以检测出大部分数据传输中发生的错误。
因此,CRC校验码被广泛应用于网络协议、数据存储设备、外部设备、行业控制系统以及航空电子等方面。
CRC校验码的计算方法如下:首先,将数据和某一多项式进行XOR运算,然后,将结果按位左移,直到最后一位,最后,将结果和多项式再次进行XOR运算,得到的结果就是CRC校验码。
多项式的选择对CRC校验码的准确性有很大影响,一般而言,多项式的阶数越高,校验码的准确性越好,但是同时也会导致计算量增加。
CRC校验码有很多种,常见的有CRC-4,CRC-8,CRC-16,CRC-32和CRC-64等,它们的计算方式都是一样的,但是多项式的选择不同。
CRC校验码的优势在于它的位冗余,也就是说,它可以检测出大部分发生在数据传输过程中的错误。
但是,由于它的位冗余,使得它在数据传输过程中需要消耗更多的带宽,因此,在实际应用中,往往需要综合考虑其优缺点,以适应不同的环境。
crc校验码手动计算例题
CRC(循环冗余校验)是一种校验方法,用于检测数据传输过程中是否出现错误。
CRC校验码的计算涉及到多项式除法,下面我将以一个简单的例题来说明如何手动计算CRC校验码。
假设我们要计算一个16位CRC校验码,我们先来看一组数据,1011011101101101。
我们将这组数据除以一个特定的生成多项式,假设这个生成多项式是x^3 + x^2 + 1(对应的二进制表示为1101)。
首先,在这组数据后面添加16个0作为校验位,得到10110111011011010000000000000000。
然后,我们用生成多项式去除这个新的数据,将得到的余数作为CRC校验码。
具体步骤如下:
1. 将生成多项式左移16位,得到110100000000000000,然后与原始数据异或。
2. 如果最高位为1,就用生成多项式去除得到的结果,否则继续左移一位并继续异或。
3. 重复上述步骤,直到所有数据被处理完毕。
经过以上步骤,我们得到的余数就是CRC校验码。
在这个例子中,假设最终得到的余数是0101,那么0101就是这组数据的CRC 校验码。
需要注意的是,CRC校验码的计算涉及到生成多项式的选择、数据位的补零、以及多次的异或和除法运算。
这是一个相对复杂的过程,需要仔细计算和理解。
希望以上例子能够帮助你理解CRC校验码的手动计算过程。