CRC8转载地址:http://blog.csdn.net/d_leo/article/details/73572373

什么是CRC校验?
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC校验原理:
其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
模2除法:
模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。
例:

1.CRC8计算与举例

CRC8校验步骤:
CRC校验中有两个关键点:
一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1
二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
CRC8具体计算步骤:
1. 选择合适的除数(生成多项式)
2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
CRC8校验码计算示例:
现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:
①将多项式转化为二进制序列,由G(X) = X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001
②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。
③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
④接收端收到数据帧后,用上面选定的除数(生成多项式),用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。

2.CRC16计算与举例

2.1CRC-16校验码计算方法:

常用查表法和计算法。

计算法一般都是:

(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
       8位相异或,把结果放于CRC寄存器,高八位数据不变;
(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多

项式(例如:1010 0000 0000 0001)进行异或;
(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低
       字节进行交换;
(8)、最后得到的CRC寄存器内容即为:CRC码。

以上计算步骤中的多项式A001(1010 0000 0000 0001)是8005按位颠倒后的结果。

查表法:

将移位异或的计算结果做成了一个表,就是将0~256放入一个长度为16位的寄存器中的低八位,高八位填充0,然后将该寄存器与多项式例如:1010 0000 0000 0001)按照上述3、4步骤,直到八位全部移出,最后寄存器中的值就是表格中的数据,高八位、低八位分别单独一个表。

例子:有一16进制只字符串 7E 00 05 60 31 32 33;要在末尾添加两个CRC16校验码 校验这7个16进制字符。注:生成多项式:CRC-CCITT (XModem)  CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或.

7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E

方法如下:
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),   之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
1.设置CRC寄存器,并给其赋值FFFF(hex)。   
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),   之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。   4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。   5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。   6.重复第2至第5步直到所有数据全部处理完成。   7.最终CRC寄存器的内容即为CRC值。CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。
CRC16转载地址:https://zhidao.baidu.com/question/242417637.html

2.CRC32计算与举例

CRC8和CRC16的计算方法相关推荐

  1. CRC基础及CRC8和CRC16的计算方法说明简介

    参考链接:https://blog.csdn.net/Chuck_lin/article/details/79199381 https://blog.csdn.net/chen249191508/ar ...

  2. 查表法的CRC8和CRC16程序

    //CRC高位字节值表 const uint8_t auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, ...

  3. 常用crc查表法_CRC校验码简介及CRC16的计算方法

    点击上方"嵌入式从0到1",选择"置顶/星标公众号" 干货福利,第一时间送达! 什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy ...

  4. Java版CRC8和CRC16工具类

    搞物联应用,通信时常用CRC校验.下面是Java版的CRC算法工具类,可直接使用. CRC8工具类 public class CRC8Util {static byte[] crc8_tab = {( ...

  5. CRC校验码简介及CRC16的计算方法

    [导读]什么是CRC校验?CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.奇偶校验虽然简 ...

  6. C# CRC8、CRC16校验

    一.校验封装到一个类 public class CrcCheck{public static byte CRC8(byte[] buffer){byte crc = 0;for (int j = 1; ...

  7. 汽车电子嵌入式技术篇(一) -CRC-8和CRC-16算法

    1  什么是CRC校验 CRC8校验在整车通信系统中应用比较广泛,相当于以前XOR(异或)的升级版,今天介绍下CRC8的校验算法. 当我们要发送报文信息时,为了避免传输过程的干扰,一般会在8字节的CA ...

  8. CRC16 - CCITT 计算方法(查表法)| C语言实现

    // CRC16_CCITT 计算方法一 unsigned short CRC16_CCITT (unsigned char *pdata, int len) {//初始值 unsigned shor ...

  9. Redis CRC16校验 1.原理概述

    CRC16校验 1.原理概述 来自简书:CRC16算法 来自github.io带图解说:CRC循环冗余校验 来自之乎专栏:CRC-16校验原理与说明 来自简书:CRC16算法 简书摘要: CRC16 ...

最新文章

  1. linux跨主机复制文件
  2. 《MySQL数据技术与实验指导》jxgl数据库的创建和插入
  3. ClickHouse数据分析列式数据库概述
  4. mysql视频教程siki_siki老师MySQL数据库从零到精通,资源教程下载
  5. Mybatis生成器插件扩展,生成OR操作
  6. 程序员的半衰期只有15年?
  7. phpcmsV9内容页hits点击量 - 调用总结
  8. 职称计算机excel2015年,2015年职称计算机《Excel2003》最新章节练习题(5)
  9. 就你赚的那点钱,我们家哪里有能力请护工?
  10. NBIOT的BC26使用
  11. PHP navicat数据搭建,navicat怎么建表
  12. 漫威首部华人英雄电影
  13. 从vc6.0转到vs2005 2008等出现的错误详解(HYD整理)
  14. python绘图设置正交坐标等距_python – 使用cartopy在其他项目中绘制投影数据
  15. knex简单的增删改查
  16. 几种数据预处理方法汇总(标准/中心化、归一化、正则化)+Python代码
  17. 心电图心跳信号多分类预测(一)
  18. 2019.4.4【母亲进入了癫狂状态】
  19. 【tips】ORM - SQLAlchemy操作MySQL数据库
  20. W2-D1-linux下文件目录基本操作

热门文章

  1. Node.js 局域网文件共享
  2. 关于WMV DRM的移除
  3. 张学友MTV全集[DVD]
  4. Linux Ubuntu Python Django MTV后端开发
  5. php微博互粉网站源代码,微博粉丝平台开发全攻略_PHP教程
  6. 笔记本出厂预装Win8改装Win7的操作步骤及常见问题
  7. 或许生活并没有那么糟
  8. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】
  9. Debugging with GDB
  10. 纯C语言用Windows api写画函数图像