0 简介

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。(百度百科)

实际上是循环进行“模2”运算,发送方和校验方拥有相同的校验多项式,针对其进行循环“模2”运算,最终生成冗余项,将冗余项添加到数据尾后,对于新的数据报文进行相同的循环“模2”运算,没有出错的话运算结果应为0,原理类似与除法的整除。

1 简单实现


如图所示,模2运算对应二进制其实就是异或运算,重复进行异或最后生成冗余项。

2 标准参数模型

可见,CRC模型有几个可变参数,1、校验位数,2、约定的多项式,如果要正确实现算法,应作出相应的标准约定。

常用的21个标准CRC参数模型:

3 实现

以CRC32的查表法为例,

static unsigned int CRC32_Table[256];
/*** 产生CRC32查表法所用的表,* 0xEDB88320:CRC32的生成项是1 0000 0100 1100 0001 0001 1101 1011 0111,去掉最高位的1,保留32bit,然后再颠倒后* 转换成16进制就是0xEDB88320*/
static void _createCRCTable(void)
{unsigned int crc32;  unsigned int idx = 0;  unsigned int bit = 0;  for(idx = 0; idx < 256; idx++)  {  crc32 = idx;  for(bit = 0; bit < 8; bit++)  {  if(crc32&1)  {  crc32 = (crc32 >> 1)^(0xEDB88320);  }  else  {  crc32 = crc32 >> 1;  }  }  CRC32_Table[idx] = crc32;  printf("0x%08x, ", CRC32_Table[idx]);if((idx+1)%8 == 0)printf("\n");}
}

代码中实现的过程看似与手出不一样,其实在原理上是相同的,表中对0-255之间的所有字符求得CRC校验值以便于下一步快速查表求得字串校验值。

if(crc32&1)
{crc32 = (crc32 >> 1)^(0xEDB88320);
}
else
{  crc32 = crc32 >> 1;
}

以上为代码核心部分,crc32缓存32位的校验值信息,类似于一个32位的滑动窗口,在低位到高位之间滑动更新,到达最后一位时,即得到最终校验值。

例如在图中,对应的校验多项式在真正运算时检索到值为一的位并将最高位的一与之异或,所以本质上第一位不参与运算,图中位数不相符,在多项式与加密大小相等的时候移位运算(>>)就可以实现滑动窗口的移动。

static const unsigned int CRC32_Table[256] =
{0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};

在计算得到CRC32校验表之后,实现查表算法

/*** [_getCRC32 使用查表法计算CRC32]* @param  buffer    [缓存地址]* @param  bufferLen [缓存长度]* @return           [计算出的CRC32值]*/
static unsigned int _getCRC32(void *buffer, unsigned int bufferLen)
{unsigned int crc32Value = 0xffffffff;unsigned char *pTmpBuffer = buffer;while(bufferLen--){crc32Value = CRC32_Table[(crc32Value^ *pTmpBuffer++) & 0xff] ^ (crc32Value >> 8);}return (crc32Value^0xffffffff);
}

查表算法将原本的一位为单位的运算,扩展为多位运算,

可以发现,扩展多位与不扩展之间的区别就是移位时补位数,当没有扩展时,补位数全为零,而扩展也就是多一步补位时对“1”位的初始异或,
例如红框的第一位,如果没有扩展为0,为1时校验和对应位多一步xor1,而这一步xor1放到最后计算结果是一样的,所以可以通过查表后的结果异或扩展值得到下一步的查表索引,并最后得到整个串的校验和。
参考:CRC32算法实现:python与C
参考:CRC校验码原理、实例、手动计算

【RE】3 CRC校验原理及实现相关推荐

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

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

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

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

  3. 简单易懂的CRC校验原理阐述

    不要跑,CRC没这么难!(简单易懂的CRC原理阐述) 网上大多的教材都是面向大佬的很多细节原理都没有讲清楚,对于我们这些新萌菜鸟们实在太不友好了.于是我写一篇相对轻松易懂的博客,希望能对学习CRC的朋 ...

  4. CRC校验原理的完整学习

    前言:1.想直接用CRC的可以直接看程序,想了解原理,或者写程序的原理的.可以看按顺序看整篇 2.模二除法没有深入研究,所以模二除法待验证,也不去验证了,我花了一个月的业余时间写.3.本文只进行了16 ...

  5. CRC校验原理和推导过程及Verilog实现(一文讲透)

    目录 一.CRC简介 1.1 CRC可检测的错误 1.2 CRC需要知道的基本名称 1.2.1 多项式公式 1.2.2 多项式简记式 1.2.3 数据宽度 1.2.4 初始值与结果异或值 1.2.5 ...

  6. 【个人学习总结】CRC校验原理及实现

    [个人学习总结]CRC校验原理及实现 一.CRC校验原理[理论篇] 1.硬核视频讲解[重点看,非常非常好!!!] 2.基础文章[略看] 3.深入文章!!![代码.查表法有点看不懂,跨越有点大] 理解重 ...

  7. CRC校验原理及步骤

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

  8. CRC校验原理及两种代码实现方法(c语言和labview实现)

    CRC校验原理及代码实现 目录 背景 原理 模2除法 多项式 计算流程 代码实现() c语言实现 c语言测试结果 labview实现 labview测试结果 目录 背景 在进行数据传输时,为了避免数据 ...

  9. CRC校验原理及代码

    参考:CRC校验原理及步骤https://blog.csdn.net/d_leo/article/details/73572373 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的 ...

最新文章

  1. JAVA-JSP Scriptlets(JSP小脚本)
  2. docker快速搭建RabbitMQ集群
  3. 国产WEB漏洞测试平台——MST
  4. 1.Excel业务分析数据
  5. WebSocket-nodejs实现
  6. 简单存取款机的实现---控制输入变量的规则
  7. java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源
  8. Catch him(HDU-2351)
  9. 699美元起!一加8系列新机海外发布:120Hz 2K屏+骁龙865
  10. Java、JSP房屋租赁管理系统
  11. 人用药品注册技术规定国际协调会议(ICH)
  12. VMware vSphere中资源池介绍
  13. OSError: cannot open resource
  14. 在Windows中查看文件的MD5值
  15. TPP-Fe(3+)四苯基卟啉铁cas16456-81-8性质说明
  16. 爬虫python淘宝_python爬虫爬取淘宝失败原因分析
  17. 【Redis】Redis常用命令
  18. 【ps功能精通】1.简单了解PS
  19. 浅谈Vue渐进式的理解
  20. 来答疑了!关于网易云信 Innovation 2022 开发者大赛,你想知道的都在这儿!

热门文章

  1. Linux运维18:网络和监控
  2. 心向天蓝,Python学习第一章之列表一
  3. 理解git fetch, git pull 以及 FETCH_HEAD的含义
  4. Stanford Parser句法分析标注含义讲解
  5. 计算机硬件配置无法启动,因计算机磁盘硬件的配置问题,windows无法启动 急!急!急!...
  6. 51单片机实战教程(六 网线测试治具设计)
  7. 信息隐藏(Information Hiding)原则
  8. 吴军:优秀的人,都有一些相似之处
  9. E2类 MCR-WPT系统的搭建
  10. 2021-11-15----韩顺平Java入门第九天