CRC校验是依据多项式模2运算进行的,这里有两点:

1. 一个二进制串总可以表示为多项式,例如:

10101 表示为 

10111 表示为 ,依次类推更长数据的表示方法。

2. 模2运算的基本规则如下:

加法:0+0=0 1+0=1 0+1=1 1+1=0   不进位

减法:0-0=0 0-1=1 1-0=1 1-1=0  不借位

模2加减运算与二进制异或运算相同

乘法:依据多项式模2加法算得 

除法:依据多项式模2减法算得 

多项式模2运算满足分配律和结合律:已知多项式  则

一个多项式模2加上自身恒为0,即

CRC校验码生成方式为多项式除法求余。准备一组待发送的二进制数据和一个除数,将二进制数据左移n位,再依照多项式模2除法除以除数,取得的余数即为CRCn的校验码。例如CRC8校验码生成方法为:待发送二进制数据左移8位,右端补0,将左移后的数据模2除以除数,算得CRC8的校验码。

发送端和接收端事先约定一个除数,发送端生成CRC校验码,加到左移后的待发送二进制数据上,将加运算后的数据发送给接收端。接收端依次接收二进制数据,首先接收的为多项式高位,最后接收的为二进制低位,按照多项式模2除法将接收到的二进制数据除以事先约定的除数,若求得余数为0则接收成功;否则接收失败。

例如待发送数据101001110100001,除数111010101共9位,将待发送数据左移9位,进行多项式模2除法,运算过程如下:

求得余数为100011000。最后发送端发送的数据为:101001110100001 100011000,后9位为余数。接收端获得二进制数据串后,直接用100011000模2除,可求得余数为0。如果传输过程中某些bit位反转,则接收端用100011000模2除,很大概率余数不为0。

3. 模2运算的特点

假设待发送二进制数据的某个片段为10100111010000100...,除数为111010101。为了方便表述,将待发送数据分为每9位一块,进行模2除法,如下图所示:

对于每块数据的求余,其运算相当于该块异或上述加红二进制串。例如中间块100001000,余数= 该块 ^ 100000000 ^ 010000000 ^ 010101000 ^ 101010100 = 该块^a^b^c^d; 其中a、b、c、d表示这些二进制块;当该块异或所得<除数时开始后一块的异或运算。

例如:中间块100001000异或所得依次为000001000  010001000 000100000 101110100,101110100 < 111010101时开始后一块的运算。

根据异或的结合律,余数= 该块^a^b^c^d = 该块 ^(a^b^c^d)。 a、b、c、d的数值与前一块相关。

CRC查表法原理

现构建一个表格,将每一块所对应的a^b^c^d存储起来。输入一个数据块,查表得到下一块需要异或的数值。例如上例中101001110对应表格内容为100000000 ^ 010000000 ^ 010101000 ^ 101010100,其刚好是101001110的CRC校验码。

某块的余数 = 该块^上一块查表输出。依次向后计算得到最后一块的余数,即为二进制串的CRC校验码。实现伪码为:

crc_table[2^n];
for(i : 2^n)crc_table[i] = i的CRCn校验码;crc = input; //输入1块
whileinput + 1crc = crc_table[crc]^(input);

在计算CRC8时表格需要项,计算CRC16时表格需要项,CRC32则需要很大的表格,资源浪费十分严重。对于CRC32运算,仍使用项的表格,每一项为8位数据对应的CRC32校验码,让输入数据流依次按字节移动并与查表输出值异或即得到CRC32校验码。除表格不同外,其他过程与CRC8运算相似。

CRC查表法运算原理相关推荐

  1. 16 位 CRC 查表法的简单使用方法

    16位CRC查表法的简单使用方法 Modbus CRC16: crc16.h #ifndef __CRC16_H__ #define __CRC16_H__#include "main.h& ...

  2. 常用crc查表法_请教查表法计算CRC的原理

    自己写过的, 希望对你有帮助 Cyclic Redundancy Check(CRC) 原理及实现 /// 1: 需求 在数据传送过程中,为了能够进行错误检测, 往往在数据后追加一些检测码, 当接受方 ...

  3. 常用crc查表法_查表法计算CRC

    (查表法)CRC检验码的计算过程 (1)将上次计算出的CRC校验码右移一个字节: (2)将移出的这个字节与新的要校验的字节进行XOR 运算: (3)用运算出的值在预先生成码表中进行索引,获取对应的值( ...

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

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

  5. CRC查表法——表的由来及Java实现CRC8校验算法

    转载请标明出处: http://blog.csdn.net/xx326664162/article/details/51718857 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定 ...

  6. CRC16查表法原理

    Preface CRC(Cyclic Redundancy Check)是数字通信系统中广泛使用的差错检测技术,本文将探究使用广泛的CRC查表法的原理实现细节,也作为一次学习记录总结. 一.CRC校验 ...

  7. CRC校验查表法原理及实现(CRC-16)

    绪论 在网上浏览了很多关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法. 至于查的表是怎么来的,软件为什么要这样实现很多文章并没有说明.本 ...

  8. crc16查表法c语言实现,CRC校验查表法原理及实现(CRC-16)

    绪论 在网上浏览了不少关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法. 至于查的表是怎么来的,软件为何要这样实现不少文章并无说明.本篇文 ...

  9. CRC校验查表法详解

    CRC校验查表法详解 算法原理 基础计算 查表法原理及计算 查表法中的表 CRC校验中数据逆序 CRC校验中的其它参数 算法原理 CRC(Cyclic Redundance Check)循环冗余校验, ...

最新文章

  1. zhlan--Python中的字典遍历方法 字典取值
  2. 第十届蓝桥杯java B组—试题D 数的分解
  3. IDEA 重复代码快速重构
  4. Mac下下载android4.2源码,进行源码调试
  5. 全国计算机等级考试题库二级C操作题100套(第28套)
  6. oracle11区分大小写,修改Oracle11g用户密码不区分大小写
  7. 现代优化计算方法_【公开课】供应链库存优化与需求预测管理
  8. 开源WinForms界面开发框架Management Studio 选项卡文档 插件 Office 2007蓝色风格 后台线程...
  9. 饿了别叫妈,叫阿里“爸爸”!
  10. Vue + ElementUI 实现全国各个省份相对应城市的联动选择
  11. 解决ppt复制到Word的图片导出PDF后出现黑线问题,word转PDF图片不清晰的问题,ppt转矢量图问题
  12. Jenkins下载历史Build版本的归档文件
  13. ajax的三种传参方式
  14. 百度通用文字识别离线SDK部署(c#)
  15. 多目标优化系列(六)SPEA
  16. (四)SGE 常用命令
  17. MacBook使用与应用推荐
  18. 智能运营新功能,多波次营销全触达
  19. 自举电路工作原理和自举电阻和电容的选取
  20. 数据结构:递归(迷宫回溯、八皇后)

热门文章

  1. 加入一个组播组过程分析
  2. 永磁同步电机(PMSM)
  3. 玩家离开游戏10个理由
  4. 关于2021/12/17国内bing不能正常访问的解决方法。
  5. NURBS求取basis函数的代码
  6. 计算机网络中隧道基本原理,隧道技术-高级计算机网络.ppt课件
  7. Linux中断申请之request_threaded_irq
  8. ora_arc0_oracle是啥,什么是Oracle数据库的ORA?
  9. springcloud 问题笔记 Redundant declaration: @SpringBootApplication already applies given @ComponentScan
  10. 不能设置断点的检查步骤