CRC-8校验原理及软件实现

一、概述

CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

二、CRC-8原理

模2除法

模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。

关键点

CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤

选择合适的多项式,确定除数。

看选定多项式的二进制位数,然后将要发送的数据上面加上这个位数-1位的0,然后用得到的数据以模2除法的方式除上面确定的除数,得到的余数就是该数的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。

示例

现假设我们使用的多项式为:G(X) = X^8+X^2+X^1+1,要求出0x1A的CRC-8校验码。下面是具体的计算过程:

将多项式转化为二进制序列,由G(X) = X^8+X^2+X^1+1可知二进制一种有9位,第8位、第2位、第1位和第0位分别为1,则序列为100000111。

原来要计算的数据为1 1010,多项式的最高次为8,则在数据的后面加上8位0,数据变为1 1010 0000 0000,然后使用模2除法除以除数100000111,最终得到的除不尽的余数,变为我们要求的CRC-8结果。

计算过程如下图:

11001

____________________

100000111|1101000000000

|100000111

____________________

101001110

100000111

____________________

100100100

100000111

____________________

1000110 = 0x46

如上图,最后除不尽的余数为0x46,所以0x1A按多项式G(X) = X8+X2+X+1计算得到的CRC-8码为0x46。

三、CRC-8软件实现

CRC-8的计算软件上可以采用循环计算的方法,也可以采用查表法,下面的代码都是以多项式G(X) = X^8+X^2+X^1+1来实现,其他的多项式也类似。

循环计算法

从上面的计算过程可以看到,多项式最高位为1,遇到需要异或数据最高位为1时, 才进行异或计算,并且异或后,最高位就为0了,最高位为0,下次也不需要异或了, 这样需要采用代码计算的方式,就可以把最高位去掉,不需要异或,最后结果也是一样的。

#define FACTOR (0x107 & 0xFF)//多项式因子(取低8bit)

unsigned char calcCRC(unsigned char *pdat, unsigned int len)

{

unsigned char j;

unsigned char crc = 0x00;

while(len--)

{

crc ^= (*pdat++);//前一字节计算CRC后的结果异或上后一字节,再次计算CRC

for (j=8; j>0; j--)

{

if (crc & 0x80)//高位为1,需要异或

{

crc <<= 1;

crc ^= FACTOR;

}

else //高位为0,不需要异或

{

crc <<= 1;

}

}

}

return crc;

}

查表法

查表法实际上就是采用法1中的方法,对0x00~0xFF计算CRC8,然后按顺序保存到数组里面,在需要计算CRC8的时候,通过查找这个数组得到CRC8。

// 按照多项式 X^8+X^2+X^1+1 生成。

static const unsigned int crc8Table[256] =

{

0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,

0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,

0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,

0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,

0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,

0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,

0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,

0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,

0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,

0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,

0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,

0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,

0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,

0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,

0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,

0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3

};

// 计算CRC

unsigned char calcCRC(unsigned char *data, unsigned int len)

{

unsigned char crc8 = 0;

while (len --)

{

crc8 = crc8 ^ (*data++);

crc8 = crc8Table[crc8];

}

return crc8;

}

计算机程序员crc算法,CRC-8校验原理及软件实现相关推荐

  1. tcp中的crc检验算法原理_在数据传输过程中的CRC 算法的简单说明

    CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CRC算法应是嵌入式程序员的基本技能.可是,我认识的嵌入式程序员 ...

  2. 循环冗余校验CRC算法

    本文参考自: https://blog.csdn.net/liyuanbhu/article/details/7882789#commentsedit 博主的文章写的太好了,我这里仅仅摘抄几个重要的知 ...

  3. CRC 算法的简单说明

    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CR ...

  4. tcp中的crc检验算法原理_CRC校验原理及其实现

    原文作者:王超的独立博客 出处:http://www.wangchaochao.top/2020/09/20/Principle-and-implementation-of-CRC/ 前言 最近的工作 ...

  5. C语言 crc32校验算法原理,CRC循环冗余校验的实现原理

    之前在做学校项目的时候用到了CRC 原理,但在网上查找的过程中,发现讲解CRC知识的资源很多,但是对新手比较友好的.讲的十分清楚的又很少,很多资料也不完善,读起来心中常常不由自主地奔腾过上千个&quo ...

  6. 常用算法 之五 数据校验(CRC 原理、LRC、奇偶校验、校验和)详解

    数据校验   数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错.为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生,并保证数据的完整 ...

  7. 【数据校验杂谈】循环冗余检验 (CRC) 算法原理

    2019独角兽企业重金招聘Python工程师标准>>> 循环冗余检验 (CRC) 算法原理 Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于 ...

  8. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  9. CRC校验原理及CRC-8简单校验函数设计

    CRC校验原理及CRC-8简单校验函数设计 CRC为循环冗余校验码,是一种常用的.具有检错.纠错能力的校验码.通常发送方在发送的数据之后,附上其CRC校验码.接收方收到数据后,也做同样的CRC校验,得 ...

  10. c语言 x16 x15 x2 1,CRC算法原理及C语言实现

    CRC算法原理及C语言实现 摘 要 本文从理论上推导出CRC算法实现原理,给出三种分别适应不同计算机或微控制器硬件环境的C语言程序.读者更能根据本算法原理,用不同的语言编写出独特风格更加实用的CRC计 ...

最新文章

  1. FPGA之道(74)Verilog生成语句
  2. 每日一皮:这一定是“宅”的极致了...
  3. export 和 export default 的区别
  4. 【Oracle 学习笔记】Day 2 视图、序列、同义词
  5. Linux源代码软件安装,Linux软件安装:源代码与软件安装
  6. linux 内核级资源查看,Linux资源管理
  7. java 写传奇游戏吗,文字版传奇游戏
  8. 【DevOps】从理念到实施
  9. Windows核心思想-宽字符与窄字符(Unicode和ASCII)
  10. (16) Node.js 模块的加载逻辑
  11. php-php连接数据库
  12. 戴尔服务器安装centos7修改网卡名,Centos7.6修改网卡名称为之前的eth形式
  13. Intellij mac快捷键
  14. 基于FPGA板的音乐盒的设计
  15. Python自学(三)
  16. Oracle PeopleSoft 应用安全加固
  17. linux qt lgl,Linux下QT、cannot find -lGL、
  18. nodejs app.js详解
  19. 浅谈用户行为分析(一)
  20. 31_ElasticSearch 修改IK分词器源码来基于mysql热更新词库

热门文章

  1. 在虚拟机中安装centos6操作系统,DHCP下克隆,再使用CRT软件进行远程登录
  2. LED点阵字模提取学习
  3. JavaScript菜鸟教程笔记
  4. java十大排序算法
  5. windirstat怎么用_使用WinDirStat分析和管理硬盘空间
  6. linux wget 安装包,linux系统下安装wget。
  7. wincc嵌入式excel报表 该报表系统能够读取WINCC中历史归档数据,产生出EXCEL报表文件,同时在画面中EXCEL控件实时显示
  8. ABB机器人DSQC406 3HAC036301-00104伺服驱动器故障报警维修
  9. ue4导入abc文件问题
  10. oracle修改执行计划,调整执行计划的三种方法