CRC8校验分析(修正版)
- 格式:doc
- 大小:61.50 KB
- 文档页数:5
crc8计算方法CRC-8 (Cyclic Redundancy Check 8-bit) 是一种循环冗余校验码,用于检测和纠正数据传输过程中可能产生的错误。
CRC-8 由 8 位二进制数组成,可以用来校验 8 位数据块。
以下是 CRC-8的计算方法以及相关参考内容。
CRC-8 的计算方法如下:1. 选择一个 9 位的生成多项式。
常用的 CRC-8 多项式有 CRC-8-ATM (0x07) 和 CRC-8-CCITT (0x9B)。
2. 将生成多项式左移一位,并将最高位设置为 0。
3. 将要计算的数据块左移一位。
4. 将数据块的最高位与生成多项式进行异或运算。
5. 重复步骤 3 和步骤 4,直到数据块的最低位都经过了异或运算。
6. 经过上述步骤后,余数即为校验码。
下面是一些关于 CRC-8 的相关参考内容:1. "A Painless Guide to CRC Error Detection Algorithms" by Ross N. Williams:这篇文章详细介绍了 CRC 算法的原理以及不同的多项式选择。
它还包含了一些具体的 CRC-8 算法实现,可以作为参考代码进行使用。
2. "Understanding CRC-8" by Kerry D. Wong:这篇文章从一个简单的例子开始介绍了 CRC-8 的计算过程,包括生成多项式的选择、数据块的移位和异或运算。
它还提供了一些常见的CRC-8 多项式值,方便选择合适的多项式。
3. "CRC Calculation with AVR Microcontrollers" by Ulrich Radig:这篇文章介绍了如何在 AVR 微控制器上使用硬件支持的 CRC 计算模块来计算 CRC-8。
它提供了一个完整的示例程序,并解释了如何配置和使用 CRC 计算模块。
4. "CRC RevEng":这是一个开源的 CRC 算法反向工程工具,包含了多种 CRC 算法的实现代码。
c语言crc8算法合并高低字节(最新版)目录1.C 语言与 CRC8 算法简介2.CRC8 算法的原理3.合并高低字节的方法4.实例演示正文【1.C 语言与 CRC8 算法简介】C 语言是一种广泛应用的编程语言,它具有简洁、高效、跨平台的特点。
在电子通信和数据处理领域,C 语言被广泛应用。
CRC8(Cyclic Redundancy Check 8,循环冗余校验 8 位)算法是一种数据校验技术,主要用于检测数据传输中的错误。
它通过计算数据包的校验和,然后将其附加到数据包中,接收方在接收到数据包后,通过相同的计算方法,比较计算出的校验和与附加的校验和是否一致,从而判断数据是否发生错误。
【2.CRC8 算法的原理】CRC8 算法基于多项式除法,其计算过程如下:1.首先选定一个 8 位的生成多项式(generator polynomial),例如:1021。
2.将待校验的数据用二进制表示,并在其后面添加 8 个 0,形成一个新的二进制数。
3.使用生成多项式去除这个新的二进制数。
这里的除法是在二进制域中进行的,也就是说,除法中的加法和减法都用异或(XOR)运算代替。
4.当除法完成后,得到的余数就是 CRC8 校验码。
将这个校验码附加在原始数据的后面,形成一个新的数据。
【3.合并高低字节的方法】在实际应用中,有时需要将一个数据字的高低字节进行合并。
一般来说,可以将数据字的高字节和低字节进行拼接,然后使用 CRC8 算法进行校验。
例如,假设有两个字节:0xAB 和 0xCD,它们的二进制表示分别为:AB: 10101011CD: 11001101首先将它们拼接起来:1010101111001101,然后使用 CRC8 算法计算校验和。
计算完成后,得到的校验和为:0xE5。
将校验和附加在原始数据的后面,得到新的数据:1010101111001101E5。
crc8查表法原理CRC8是一种很实用的校验方式,可以用于数据传输时的校验。
在实现CRC8校验时,很多人都使用了CRC8查表法。
那么,CRC8查表法的原理是什么呢?下面就为大家详细讲解。
1、CRC8的原理CRC全称为Cyclic Redundancy Check,即循环冗余校验。
在数据传输过程中,发送方使用CRC算法来产生一段校验和,并且将其附加到消息尾部。
接收方再使用相同的CRC算法来计算校验和,如果计算出的结果与附加在消息尾部的校验和相同,就说明数据没有在传输过程中受到损坏或篡改。
CRC8是CRC校验的一种,其采用了8位二进制数表示校验和,具有很高的效率和可靠性。
在实现CRC8校验时,有多种算法可供选择,其中CRC8查表法是一种很受欢迎的实现方式。
2、CRC8查表法的原理CRC8查表法是一种基于查表的CRC8校验算法。
其基本原理是提前计算出256个8位二进制数的CRC校验码,存储在一个256行、每行8列的查找表中。
在实际应用中,发送方在传输数据时,将每个数据字节的CRC校验码逐个累加得到最终的CRC校验和并附加到数据尾部。
而接收方在接收到数据时,则可以根据接收到的数据和CRC校验和,在查找表中查找对应的CRC校验码,并对其进行逐个累加,最终检验数据的完整性。
实现CRC8查表法的关键在于如何提前计算出所有的256个CRC 校验码。
一般而言,可以采用以下步骤来完成:(1)在计算CRC8校验码时,先使用多项式除法算法,将每个数据字节的最高位取1,剩余7位取0,与CRC校验和进行多项式除法运算,以得到CRC校验码的最高位。
(2)依次使用多项式除法算法,将数据字节中的每个二进制位与CRC校验和进行多项式除法运算,以得到CRC校验码的所有8位。
(3)将每个字节的CRC校验码依次存储在一个256行、每行8列的查找表中。
3、总结综合来看,CRC8查表法是一种简单、高效、可靠的CRC校验算法。
与其它实现方式相比,它的优点在于无需复杂的算法运算,只需要预先计算出所有的CRC校验码并存储到查找表中,就可以方便地进行数据校验。
CRC校验校验原理:1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+gRx R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC 码字。
4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001x4m(x)=x10+x8+x7+x4对应的代码记为:10110010000;采用多项式除法: 得余数为: 1010 (即校验字段为:1010)发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,CRC校验源码分析这两天做项目,需要用到CRC 校验。
以前没搞过这东东,以为挺简单的。
结果看看别人提供的汇编源程序,居然看不懂。
花了两天时间研究了一下CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省点时间。
先是在网上下了一堆乱七八遭的资料下来,感觉都是一个模样,全都是从CRC 的数学原理开始,一长串的表达式看的我头晕。
CRC校验方法详解CRC(Cyclic Redundancy Check)是一种数据校验方法,广泛应用于网络通信、存储介质和数据传输领域,用于检测和纠正数据传输过程中的错误。
CRC校验使用一种多项式计算方法,通过计算传输的数据的余数来检测错误。
在发送端,多项式运算被用于生成一定长度的校验码,并将它附加到待发送的数据中。
在接收端,数据和校验码被再次进行多项式运算,得到一个余数。
如果余数为0,说明数据传输没有错误;如果余数不为0,则说明数据出现了错误。
1.选择一个合适的CRC生成多项式。
CRC校验的效果取决于所选择的生成多项式。
常用的生成多项式有CRC-8、CRC-16和CRC-32等。
2.将待发送的数据构造成一个二进制多项式。
数据的每个字节被表示为8位二进制数,按照顺序排列,形成一个多项式。
3.将生成多项式左移和数据多项式异或。
将生成多项式左移和数据多项式进行异或操作,然后进行下一位的判断。
4.重复上述步骤,直到进行完所有的位判断。
这样可以得到一个余数,用于校验数据传输中的错误。
总结来说,CRC校验是通过计算数据的余数来检测错误的一种方法。
它通过选择一个合适的生成多项式,对待发送的数据进行多项式运算,得到一个余数。
接收端再次进行多项式运算,检查余数是否为0。
如果余数为0,则说明数据传输没有错误。
如果余数不为0,则说明数据传输中可能存在错误。
1.高效性:CRC校验是一种简单的校验方法,计算速度较快,可以快速检测数据传输中是否存在错误。
2.纠错能力强:CRC校验不仅可以检测出数据传输中存在的错误,还可以通过余数的位置和值,定位并纠正错误。
3.易于实现:CRC校验的实现比较简单,只需要选择合适的生成多项式,然后进行多项式运算即可。
然而,CRC校验方法也存在一些缺点:1.不适用于所有场景:CRC校验对于一些特殊的数据传输情况可能不适用,例如数据长度较长或者存在较高的错误率。
2.无法纠正所有错误:虽然CRC校验可以检测出存在的错误,并且对于一些错误还能进行纠正,但它无法纠正所有的错误,有些错误会被误判为正确的数据。
CRC8校验算法及在飞机电气综合试验管理系统的应用作者:宋浩,李玉忍,梁波来源:《现代电子技术》2011年第20期摘要:为了满足飞机电气综合试验管理系统高速网络通信中数据校验的要求,通过分析串行算法的不足之后采用并行算法实现CRC8校验。
为了推导出CRC8校验的并行算法,首先通过描述除法电路结构和运算步骤,推导出串行算法及其实现电路,然后进一步通过演算实现其并行算法。
这里首次给出了应用并行算法基于LabVIEW实现CRC8校验的方法,并将其应用于飞机电气综合试验管理系统。
关键词:CRC8;并行算法;LabVIEW;多项式除法电路中图分类号:TN911-34 文献标识码:A文章编号:1004-373X(2011)20-0131-03CRC8 Calibration Algorithm and Its Application in ManagementSystem for Rircraft Electric Comprehensive TestSONG Hao, LI Yu-ren, LIANG Bo(Northwestern polytechnical university, Xi’an 710072, China)Abstract: In order to meet the requirements of data validation in high-speed network communications of the plane electrical comprehensive test management system, the parallel algorithm is adopted to realize CRC8 calibration after disscussing the defect of serial algorithm. To derive the parallel algorithm for CRC8 calibration, the division circuit structure and operation procedures are described, and the serial algorithm and its realization circuit are derived. After that, the parallel algorithm is realized through further calculus. The CRC8 calibration was achieved by the parallel algorithm based on LabVIEW. It was applied successfully to plane electric comprehensive test management system.Keywords: CRC8; parallel algorithm; LabVIEW; circuit of polynomial division0 引言在网络通信中,由于各种噪音干扰使数据传输产生未知差错,为保证通信的正确性,需要一种检错机制来判断接收到的数据是否正确。
e2e profile1 crc 8 计算方法e2e Profile1 CRC 8计算方法CRC(Cyclic Redundancy Check)是一种在数据传输中常用的校验方法,通过计算数据的CRC值,可以检测出传输过程中是否发生了错误或者数据损坏。
在e2e Profile1中,使用CRC 8计算方法来实现数据校验。
本文将介绍e2e Profile1 CRC 8的计算方法及其具体步骤。
一、概述e2e Profile1是一种端到端(end-to-end)的通信协议,用于在不同的电子设备之间进行数据传输。
CRC 8是一种8位CRC校验方法,适用于e2e Profile1协议中的数据校验。
下面将详细介绍e2e Profile1 CRC 8的计算方法。
二、计算步骤1. 准备数据首先,需要准备要进行校验的数据。
假设要校验的数据为D,数据长度为n。
2. 初始化CRC值将CRC值初始化为0。
3. 循环计算对每一个数据位进行循环计算,直到计算完所有数据位。
4. XOR运算将每个数据位与CRC值进行异或(XOR)运算,并将结果存储为新的CRC值。
5. 移位操作将CRC值左移1位。
6. 判断最高位如果CRC值的最高位为1,则进行一次XOR运算,并将结果存储为新的CRC值。
7. 判断是否计算完所有数据位如果还有未计算的数据位,则返回步骤3,否则继续下一步。
8. 得到最终的CRC值经过以上步骤计算出的CRC值即为最终的校验值。
三、示例为了更好地理解e2e Profile1 CRC 8的计算方法,这里举一个简单的示例。
假设要校验的数据D为11011011,数据长度为8位。
将CRC初始化为0。
首先,对第一个数据位1进行异或运算,得到新的CRC值为1。
然后将CRC值左移1位,并判断最高位。
此时,最高位为1,进行一次XOR运算,新的CRC值为0。
接下来,对第二个数据位1进行异或运算,得到新的CRC值为1。
再将CRC值左移1位,最高位为1,进行一次XOR运算,新的CRC 值为0。
crc8计算方法CRC8(Cyclic Redundancy Check 8)是一种错误检测算法,常用于数据传输过程中对数据的校验。
它通过生成一个8位的校验码,用于校验数据在传输过程中是否发生错误。
CRC8的计算方法如下:1. 初始化CRC8寄存器为0x00。
2. 依次处理每个字节的数据。
将当前字节与CRC8寄存器的值进行异或操作,并将结果存入CRC8寄存器。
3. 对CRC8寄存器的每个比特位进行处理,如果当前比特位为1,则将寄存器的值右移一位并与0x8C进行异或操作;如果当前比特位为0,则只将寄存器的值右移一位。
4. 重复第2步和第3步,直到处理完所有的数据。
5. 最后得到的CRC8寄存器的值即为计算得到的校验码。
下面我们通过一个示例来演示如何使用CRC8计算方法计算数据的校验码。
假设我们要计算数据0x31323334的校验码。
根据上述步骤,我们依次处理每个字节的数据:1. 初始化CRC8寄存器为0x00。
2. 对字节0x31进行处理:- 将0x31与CRC8寄存器的值0x00进行异或操作,得到结果0x31。
3. 对字节0x32进行处理:- 将0x32与CRC8寄存器的值0x31进行异或操作,得到结果0x03。
- 对CRC8寄存器的比特位进行处理,0x03的二进制表示为00000011,根据当前比特位为1的规则,右移一位并与0x8C 进行异或操作,得到结果0x46。
4. 对字节0x33进行处理:- 将0x33与CRC8寄存器的值0x46进行异或操作,得到结果0x75。
- 对CRC8寄存器的比特位进行处理,0x75的二进制表示为01110101,根据当前比特位为1的规则,右移一位并与0x8C 进行异或操作,得到结果0xDA。
5. 对字节0x34进行处理:- 将0x34与CRC8寄存器的值0xDA进行异或操作,得到结果0xEE。
- 对CRC8寄存器的比特位进行处理,0xEE的二进制表示为11101110,根据当前比特位为1的规则,右移一位并与0x8C 进行异或操作,得到结果0xA7。
关于CRC8CRC16CRC32,你要找的全部在这循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是⼀种根据⽹络数据包或电脑⽂件等数据产⽣简短固定位数校验码的⼀种散列函数,主要⽤来检测或校验数据传输或者保存后可能出现的错误。
循环冗余校验Wikipedia⼀句话:CRC是将数据计算出散列的⽅式,⼀般⽤于校验数据的完整性。
它具有简单、执⾏效率⾼等特点。
当然,你可以类⽐于Checksum,但⽐Checksum复杂些,防碰撞性更好些。
▍CRC的原理除法的。
实际的输⼊数据会被解释为⼀个长⼆进制位流(除数),再将其除以另⼀个固定⼆进制数(除数,即多项式)。
该除法的其余部分就是校验值。
CRC是基于除法但是,现实要复杂⼀些。
⼆进制数(除数和除数)不被视为普通整数值,⽽是被视为⼆进制多项式,其中实际位⽤作系数。
输⼊数据,看做⼀串⼆进制流,⽤多项式的⽅式表⽰为g(x),⽽除数是国际标准上的多项式,⽤h(x)表⽰。
通过g(x)和h(x)做除法,即两者的异或运算,得出的结果,就是我们所说的CRC运算检验结果。
那么,这⾥有两个疑问:问题1:多项式和⼆进制是什么关系?例如,1x3 + 0x2 + 1x + 1可以表⽰为1011b,或者1011b表⽰为1x3 + 0x2 + 1x + 1,其中是0的位,即以0为系数乘以该项。
问题2:除法怎么做?本质就是在做异或运算我们来看看⼀个数据串11010011101100除以x3 + x + 1是怎样进⾏的?注意,根据CRC长度,需要将这个数据串补0整个运算过程是这样的:实际上就是逐个bit移位做异或。
详见:https:///wiki/Cyclic_redundancy_check▍CRC的概念实际上,⼈们根据不同的需要,做了很多种计算⽅式,主要差别在于CRC长度、多项式、初始值、结果是否需要异或、是否需要翻转等等。
⾸先,来看看⼏个概念:Length: CRC的长度(按bit算,如8,16,32)Name: CRC的名字,让⼈⼀看就知道这是哪种CRCPolinomial: 多项式,通过该多项式来计算CRCInitialValue: CRC的初始值FinalXorValue: CRC结果做异或运算的值InputReflected: 指⽰输出是否需要翻转OutputReflected: 指⽰输出是否需要翻转我将⽹上搜到的所有的CRC标准分类做了个汇总:从上⾯的CRC名称可以看出,不同的算法是有不同⽤途的,这是国际常规的⽤法定义,其实如果是⽤户⾃⼰⽤也没特别要求,可以⾃由点。
crc 8bit数据累加截取低32bit的校验法概述说明1. 引言1.1 概述CRC 8位数据累加截取低32位的校验法是一种常见的校验方法,被广泛应用于数据通信领域。
通过对待校验数据进行逐位计算和累加运算,再截取CRC结果的低32位作为校验值,可以快速、高效地检测数据传输过程中是否出现错误或篡改。
1.2 文章结构本文将首先介绍CRC的基本概念和原理,包括CRC简介、数据累加方法以及截取低32位校验的原理和意义。
接下来,将详细阐述实现该校验法的步骤,包括初始化CRC寄存器和多项式值、对数据进行逐位计算和累加运算,并最终截取低32位作为校验值。
此外,本文还将分析该方法在通信中的应用案例,并与其他校验方法进行优势比较。
最后,提供了实际应用中需要注意的问题和解决方案,并对CRC校验法的实用性与适用性进行讨论,并展望未来该方法的发展趋势。
1.3 目的本文旨在全面介绍CRC 8位数据累加截取低32位的校验法的原理和实现步骤,以及其在通信领域中的应用与优势。
通过本文的阐述,读者能够深入理解该校验法,并能够在实际应用中灵活运用和解决相关问题。
此外,本文还希望为未来该方法的发展提供参考和展望,促进校验技术的创新与进步。
2. CRC 8位数据累加截取低32位的校验法2.1 CRC简介CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于通信和数据存储领域的校验方法。
它通过对数据进行算法性处理,产生一个固定长度的校验值,用于检测和纠正传输或存储过程中的错误。
2.2 数据累加方法CRC使用多项式除法来进行数据校验。
首先需要初始化一个名为CRC寄存器的变量,并赋予初始值。
然后逐个字节或比特地将需要校验的数据依次与多项式进行异或运算,并将结果保存在CRC寄存器中。
2.3 截取低32位校验的原理和意义在CRC运算过程中,随着每次异或运算的进行,CRC寄存器会不断更新其值。
而为了保证计算结果能够准确表示整个数据流中的错误情况,通常只截取一部分校验码作为最终结果。
8位crc和16crc 查表法CRC(Cyclic Redundancy Check)是一种循环冗余校验码,用于检测数据传输中的错误。
它通过给数据附加一个校验值来进行操作,以便在接收端能够验证数据的准确性。
本文将介绍8位CRC和16位CRC的查表法。
查表法是一种计算CRC的有效方法,它通过预先计算存储在查表中的校验值来加快计算速度。
8位CRC和16位CRC的查表法都是基于这种思想实现的。
首先,我们来介绍8位CRC的查表法。
8位CRC的查表法需要预先生成一个256长度的查表数组。
该数组的每个元素都是一个8位的校验值。
生成查表数组的方法如下:1.初始化CRC寄存器为全1。
2.对每个可能的8位输入值进行循环:a.将输入值与CRC寄存器进行异或操作。
b.对CRC寄存器进行8次右移操作。
3.根据CRC寄存器的最终值,将对应输入值的校验值存储在查表数组中。
生成查表数组后,我们可以使用该数组对数据进行CRC计算。
计算方法如下:1.初始化CRC寄存器为全1。
2.对每个输入字节进行循环:a.将当前输入字节与CRC寄存器进行异或操作,得到查表数组的索引。
b.根据索引从查表数组中取出对应的校验值。
c.将CRC寄存器与校验值进行异或操作。
d.对CRC寄存器进行8次右移操作。
3.根据CRC寄存器的最终值得到计算得到的校验值。
接下来,我们来介绍16位CRC的查表法。
与8位CRC类似,16位CRC的查表法也需要预先生成一个65536长度的查表数组。
生成查表数组的方法如下:1.初始化CRC寄存器为全1。
2.对每个可能的16位输入值进行循环:a.将输入值与CRC寄存器进行异或操作。
b.对CRC寄存器进行16次右移操作。
3.根据CRC寄存器的最终值,将对应输入值的校验值存储在查表数组中。
生成查表数组后,我们可以使用该数组对数据进行CRC计算。
计算方法如下:1.初始化CRC寄存器为全1。
2.对每个输入字节进行循环:a.将当前输入字节与CRC寄存器进行异或操作,得到查表数组的索引。
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
(网上流行的这一篇文章,前后两种算法得出来的CRC校验码并不一样,经过多次比对,发现查表法算出来的是正确的.一般性算法却不对,最后总结出来的是每一字节的被除数要反过来读取,算完后余数[即CRC码]也要反过来读取才对,不知何故,如果你懂,请发博文告诉大家.)CRC校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即CRC校验码),来判断接收的数据是否正确。
在发送端,根据要传送的k位二进制码序列,以一定的规则(CRC校验有不同的规则。
这个规则,在差错控制理论中称为“生成多项式”。
)产生一个校验用的r位校验码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。
在接收端,根据信息码和CRC码之间所遵循的规则(即与发送时生成CRC校验码相同的规则)进行检验,校验采用计算机的模二除法,即除数和被除数(即生成多项式)做异或运算,进行异或运算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,传输错误。
CRC8即最终生成的CRC校验码为1字节,其生成多项式,生成多项式为g(x)=x8+x5+x4+1,相当于g(x)=1·x8+0·x7+0·x6+1·x5+1·x4+0·x3+0·x2+0·x1+1·x0,即对应的二进制数为100110001。
CRC8校验算法:1.CRC8校验的一般性算法:例如:信息字段代码为: 0X01 0X02 ————对应m(x)=x8+x(00000001) (00000010)反过来读取,即为10000000 01000000生成多项式为:g(x)=x8+x5+x4+1 ————对应g(x)的二进制代码为:100110001现在我们将要对2字节数据0x0102生成CRC8校验码,并最终将生成的1字节CRC校验码跟在0x0102的后面,即0x01 02 ##,(##即8为CRC码),最终生成的3字节数据就是经CRC8校验生成的数据。
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
(网上流行的这一篇文章,前后两种算法得出来的CRC校验码并不一样,经过多次比对,发现查表法算出来的是正确的.一般性算法却不对,最后总结出来的是每一字节的被除数要反过来读取,算完后余数[即CRC码]也要反过来读取才对,不知何故,如果你懂,请发博文告诉大家.)
CRC校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即CRC校验码),来判断接收的数据是否正确。
在发送端,根据要传送的k位二进制码序列,以一定的规则(CRC校验有不同的规则。
这个规则,在差错控制理论中称为“生成多项式”。
)产生一个校验用的r位校验码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共
k+r位,然后发送出去。
在接收端,根据信息码和CRC码之间所遵循的规则(即与发送时生成CRC校验码相同的规则)进行检验,校验采用计算机的模二除法,即除数和被除数(即生成多项式)做异或运算,进行异或运算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,传输错误。
CRC8即最终生成的CRC校验码为1字节,其生成多项式,生成多项式为g(x)=x8+x5+x4+1,相当于g(x)=1·x8+0·x7+0·x6+1·x5+1·x4+0·x3+0·x2+0·x1+1·x0,即对应的二进制数为100110001。
CRC8校验算法:
1.CRC8校验的一般性算法:
例如:信息字段代码为: 0X01 0X02 ————对应m(x)=x8+x
(00000001) (00000010)
反过来读取,即为10000000 01000000
生成多项式为:g(x)=x8+x5+x4+1 ————对应g(x)的二进制代码为:100110001
现在我们将要对2字节数据0x0102生成CRC8校验码,并最终将生成的1字节CRC校验码跟在0x0102的后面,即0x01 02 ##,(##即8为CRC码),最终生成的3字节数据就是经CRC8校验生成的数据。
先计算x8m(x)=x16+x9,对应的2进制数为:10000000 01000000 00000000 。
可以看到这样运算所得到的结果其实就是将信息字段代码的数左移8位。
因为最终要将生成的8位CRC8校验码附在信息字段的后面,所以要将信息字段的数左移8位。
最后用x8m(x)得到的二进制数对生成多项式g(x)进行模二运算,最终的余数(其二进制数的位数一定比生成多项式g(x)的位数小)就是所要的CRC8校验码。
10000000 01000000 00000000
^10011000 1
---------------------------
11000 11000000 00000000
^10011 0001
---------------------------
1011 11010000 00000000
^1001 10001
---------------------------
10 01011000 00000000
^10 0110001
---------------------------
111010 00000000
^100110 001
---------------------------
11100 00100000
^10011 0001
---------------------------
1111 00110000
^1001 10001
---------------------------
110 10111000
^100 110001
---------------------------
10 01111100
^10 0110001
---------------------------
00011110
对x8m(x)做模二运算取余得00011110,再反过来读取,即为01111000(0x78),这个8位的二进制数就是CRC8校验码。
所以,经CRC8校验后研发送的数据就是0x010278。
2.CRC8校验在DS18B20中的应用:
以上分析的是常规的CRC8校验方法。
在DS18B20中,有两处用到CRC。
一是DS18B20的8字节的序列号,最后一字节是前面七个字节的CRC码,这是为了保证序列号的唯一性与正确性;另一个是在DS18B20内部9字节的高速温度存储器,其第9字节是前面8个字节的CRC 校验码,这是为了温度数据传输的正确性。
而在DS18B20中生成CRC码所用到的方法不同于常规生成算法,它采用的是逆序CRC信息单元编码算法,该CRC的生成是由DS18B20中的多项式寄存器通过其中所包含的移位寄存器以及异或门对输入该多项式寄存器的每一位二进制数做一定的运算所得到的CRC码(可以查看Maxim官网上DS18B20的应用笔记Note27,专门介绍DS18B20CRC详细生成过程)。
在此列举两种DS18B20CRC校验的C程序。
A.按位运算方法
[cpp]view plaincopyprint?
1. /********************************************************/
2. /*DS18B20的CRC8校验程序*/
3. /********************************************************/
4. u char calcrc_1byte(uchar abyte)
5. {
6. uchar i,crc_1byte;
7. crc_1byte=0; //设定crc_1byte初值为0
8. for(i = 0; i < 8; i++)
9. {
10. if(((crc_1byte^abyte)&0x01))
11. {
12. crc_1byte^=0x18;
13. crc_1byte>>=1;
14. crc_1byte|=0x80;
15. }
16. else
17. crc_1byte>>=1;
18. abyte>>=1;
19. }
20. return crc_1byte;
21. }
22. uchar calcrc_bytes(uchar *p,uchar len)
23. {
24. uchar crc=0;
25. while(len--) //len为总共要校验的字节数
26. {
27. crc=calcrc_1byte(crc^*p++);
28. }
29. return crc; //若最终返回的crc为0,则数据传输正确
30. }
0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,
};
unsigned char CRC8_Table(unsigned char *p, char counter)
{
unsigned char crc8 = 0;
for( ; counter > 0; counter--)
{
crc8 = CRC8Table[crc8^*p]; //查表得到CRC码
p++;
}
return crc8;
}
DS18B20的两种校验CRC码的方法本质上都是一样的。
查表法是对0x00~0xff这256个数依次生成与每一个数对应的CRC码所组合成的表,每次算一字节数据的CRC码不用经过calcrc_1byte(uchar abyte)这个函数对每个数据的最低位进行判断是1还是0,而直接通过查表的方式直接提取出 crc8^*p的CRC码,其运行效率相对按位运算方法更高,但是查表法所列的表却很占空间。
查表法算0X0102: crc8 = 0,先算0X01, crc8 ^0X01=0X01,查表,第0X01项,即为0X5E,
crc8=0X5E,crc8^0X02=0X5C,查表,第0X5C(92)项,正好是0X78.。