CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法,讲CRC算法的文章很多,之所以还要写这篇,是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC算法。
  先说说什么是数据校验。数据在传输过程(比如通过网线在两台计算机间传文件)中,由于传输信道的原因,可能会有误码现象(比如说发送数字5但接收方收到的却是6),如何发现误码呢?方法是发送额外的数据让接收方校验是否正确,这就是数据校验。最容易想到的校验方法是和校验,就是将传送的数据(按字节方式)加起来计算出数据的总和,并将总和传给接收方,接收方收到数据后也计算总和,并与收到的总和比较看是否相同。如果传输中出现误码,那么总和一般不会相同,从而知道有误码产生,可以让发送方再发送一遍数据。  
  CRC校验也是添加额外数据做为校验码,这就是CRC校验码,那么CRC校验码是如何得到的呢?  
  非常简单,CRC校验码就是将数据除以某个固定的数(比如ANSI-CRC16中,这个数是0x18005),所得到的余数就是CRC校验码。  
  那这里就有一个问题,我们传送的是一串字节数据,而不是一个数据,怎么将一串数字变成一个数据呢?这也很简单,比如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),比如数字是0x01,0x02,0x03,那么对应的数字就是0x10203;依次类推。如果字节数很多,那么对应的数就非常非常大,不过幸好CRC只需要得到余数,而不需要得到商。  
  从上面介绍的原理我们可以大致知道CRC校验的准确率,在CRC8中出现了误码但没发现的概率是1/256,CRC16的概率是1/65536,而CRC32的概率则是1/2^32,那已经是非常小了,所以一般在数据不多的情况下用CRC16校验就可以了,而在整个文件的校验中一般用CRC32校验。  
  这里还有个问题,如果被除数比除数小,那么余数就是被除数本身,比如说只要传一个字节,那么它的CRC就是它自己,为避免这种情况,在做除法之前先将它移位,使它大于除数,那么移多少位呢?这就与所选的固定除数有关了,左移位数比除数的位数少1,下面是常用标准中的除数:  
  CRC8:多项式是X8+X5+X4+1,对应的数字是0x131,左移8位  
  CRC12:多项式是X12+X11+X3+X2+1,对应的数字是0x180D,左移12位  CCITT
  CRC16:多项式是X16+X12+X5+1,对应的数字是0x11021,左移16位  ANSI
  CRC16:多项式是X16+X15+X2+1,对应的数字是0x18005,左移16位  
  CRC32:多项式是X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1,对应数字是0x104C11DB7,左移32  
  因此,在得到字节串对应的数字后,再将数字左移M位(比如ANSI-CRC16是左移16位),就得到了被除数。  
  好了,现在被除数和除数都有了,那么就要开始做除法求CRC校验码了。CRC除法的计算过程与我们笔算除法类似,首先是被除数与除数高位对齐后,被除数减去除数,得到了差,除数再与差的最高位对齐,进行减法,然后再对齐再减,直到差比除数小,这个差就是余数。
  不过和普通减法有差别的是,CRC的加(减)法是不进(借)位的,比如10减01,它的结果是11,而不是借位减法得到的01,因此,实际上CRC的加法和减法所得的结果是一样的,比如10加01的结果是11,10减01的结果也是11,这其实就是异或操作。
  代码:略。
  原文链接:
  https://www.cnblogs.com/wchonline/p/11698677.html

(转)CRC校验算法详解相关推荐

  1. CRC校验码详解+Verilog实现(含代码)

    目录 CRC码简介 CRC校验码生成步骤 CRC码生成多项式 CRC校验码Verilog实现 CRC即循环冗余校验,是一种数字通信中的常用信道编码技术.其特征是信息段和校验字段的长度可以任意选定 CR ...

  2. Android签名与校验过程详解

    原文:https://blog.csdn.net/gulinxieying/article/details/78677487 目 录 一.签名与校验原理概要    2 1.数字签名简介    2 2. ...

  3. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  4. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  5. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  6. zend framework php编码规范,Zend Framework常用校验器详解

    本文实例讲述了Zend Framework常用校验器.分享给大家供大家参考,具体如下: Date日期校验器 代码:<?php require_once 'Zend/Validate/Date.p ...

  7. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  8. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  9. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  10. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

最新文章

  1. matlab图像滤波
  2. 网络安全从事工作分类_那么,您想从事安全工作吗?
  3. 十大成长型机器人技术大盘点
  4. adjango 基本的使用
  5. tomcat中的几种log catalina localhost
  6. 嵌入式中的 *(volatile unsigned int *)0x500 解释
  7. ProxySQL Cluster 概述
  8. 60 个神级 VS Code 插件!
  9. 腾讯AI大战王者荣耀!504场1v1仅输1场,5v5达电竞职业水平
  10. mysql 8.0.19 winx64安装及修改初始密码
  11. HDU 5898 odd-even number
  12. 灰色关联分析_(案例)相关分析之灰色关联度
  13. centos 下载tomcat8
  14. Windows10系统教育版和专业版区别在哪里?
  15. 做硬件,真的没前途吗?看看资深工程师是怎么说的
  16. c# 讯飞语音 sdk
  17. From Nand to Tetris Week2 2021 超详细笔记
  18. 软件------关于spacedesk分屏软件的使用说明(包括下载和具体启动方式)
  19. 解决com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
  20. 妈妈,我以后也要上南邮!

热门文章

  1. 雷诺方程、脉动运动方程及雷诺应力输运方程的推导
  2. 近期热门微信小程序demo源码下载汇总
  3. 2021最新 武汉互联网公司
  4. Android arm64-v8a、armeabi-v7a、armeabi、x86详解
  5. 台式机设成仅计算机,如何把台式电脑设置成wifi热点
  6. 连接NI采集箱9181与9184
  7. matlab可以输出图像吗,MATLAB中使用程序输出图片
  8. Siamese Network 孪生网络基础学习笔记
  9. NLP - AIML
  10. 手眼标定,我的结果显示手和眼相距上千米!手眼标定结果准确率如何提高?