之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重温一遍,一下就通了。笔记如下

CRC我没记错的话是Cyclic Redundancy Code,Cyclic和Redundancy非常传神,所谓冗余就是附加的信息,这就是计算下面的原始数据时为什么原始数据要左移四位的原因,

  1. /************************************************************************
  2. *
  3. * The simplest CRC implement algorithm.
  4. *
  5. ************************************************************************/
  6.  
  7. /************************************************************************
  8. Load the register with zero bits.
  9. Augment the message by appending W zero bits to the end of it.
  10. While (more message bits)
  11. Begin
  12. Shift the register left by one bit, reading the next bit of the augmented message into register bit position 0.
  13. If (a 1 bit popped out of the register during step 3)
  14. Register = Register XOR Poly.
  15. End
  16. The register now contains the remainder.
  17. ************************************************************************/
  18.  
  19. #include <stdio.h>
  20.  
  21. #define POLY 0x13
  22.  
  23. int main()
  24. {
  25. // the data
  26. unsigned short data = 0x035b;
  27.  
  28. // load the register with zero bits
  29. unsigned short regi = 0x0000;
  30.  
  31. // augment the data by appending W(4) zero bits to the end of it.
  32. data <<= ;
  33.  
  34. // we do it bit after bit
  35. ; cur_bit >= ; -- cur_bit )
  36. {
  37. // test the highest bit which will be poped later.
  38. // in fact, the 5th bit from right is the hightest bit here
  39. ) & 0x0001 ) == 0x1 ) //凑够5位数(与被除数即生成多项式的位数一样),模2除
  40. {
  41. regi = regi ^ POLY;
  42. }
  43. // shift the register regi <<= 1;
  44. // reading the next bit of the augmented data
  45. unsigned short tmp = ( data >> cur_bit ) & 0x0001;
  46. regi |= tmp;
  47.  
  48. }
  49.  
  50. // and now, register contains the remainder which is also called CRC value.
  51. ;
  52. }

以上程序就是上面照片里算法的模拟实现,步骤完全一致。

Some popular polys are:

16 bits: (16,12,5,0) [X25 standard]

(16,15,2,0) ["CRC-16"]

32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]

我们常用的CRC生成多项式如上,如果CRC32校验也要按BIT来计算的话,将是一个多么大的工程。所以一般会以BYTE为单位进行计算,因为计算机的寄存器位数都是8的位数。

我们先来看异或的一个特性,这是我们展开下面描述的基础:

还是照片里的计算例子,这里把首位为0

  1. Original message :
  2.  
  3. Poly :
  4.  
  5. Message after appending W zeros :
  6.  
  7. Now we simply divide the augmented message by the poly using CRC
  8.  
  9. arithmetic. This is the same division as before:
  10.  
  11. = Quotient (nobody cares about the quotient)
  12. _______________
  13. ) = Augmented message ( + )
  14. =Poly ,,.,,....
  15. -----,,.,,....
  16. ,.,,.... //每一次的余数就是寄存器里的当前值,这里寄存器已经左移了一位,
  17. //读入一位新数据
  18. ,.,,....
  19. -----,.,,....
  20. .,,.... //首位为0,寄存器内值比除数小,则继续读入下一位
  21. .,,....
  22. -----.,,....
  23. ,,....
  24. ,,....
  25. -----,,....
  26. ,....
  27. ,....
  28. -----,....
  29. ....
  30. ....
  31. -----....
  32. ...
  33. ...
  34. -----...
  35. ..
  36. ..
  37. -----..
  38. .
  39. .
  40. -----.
  41.  
  42. -----
  43. = Remainder = THE CHECKSUM!!!! 

我们试另一种算法,把数据1101011011以5位一段分开:11010,11011

先对11010做对poly的CRC校验,即110100000模2除poly结果是1000,把1000 0000与110110000异或,得到10110000再模2除poly,结果还是1110与之前的计算结果一样。

看到这里,你可能想到了,把数据按8位一段划分,先对最高位的byte进行CRC校验,校验值与下一byte异或进行校验。。。。。。。,最后我们也得到了CRC校验值。

再探CRC的更多相关文章

  1. 再探CRC(转)

    源:http://hi.baidu.com/skystalker/item/228a263147f74e87f5e4ad8d 之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重 ...

  2. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  3. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  4. 再探jQuery

    再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...

  5. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  6. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  7. 再探ASP.NET 5(转载)

    就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...

  8. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  9. 第四节:SignalR灵魂所在Hub模型及再探聊天室样例

    一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...

随机推荐

  1. IIS限制ASP.Net 文件上传大小解决方案,修改IIS7/7.5配置

    当在web.config中设置了 httpruntime 后还是无法成功上传大文件,则要修改IIS的系统config IIS 7 默认文件上传大小是30M 要突破这个限制: 修改IIS的applica ...

  2. pull解析xml文件

    pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...

  3. Android开发之ViewPager

    什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...

  4. 转载---SQL Server XML基础学习<1>之--FOR XML PATH

    --> 测试数据:#tbIF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL    DROP TABLE #tbGO CREATE TABLE #tb      ...

  5. 什么是NSTimer

    本文主要是介绍什么是NSTimer,具体使用请参考上一篇博客. 1.什么是NSTimer? NSTimer就是timer就是一个能在从现在开始的后面的某一个时刻或者周期性的执行我们指定的方法的对象. ...

  6. iOS开发——文本高度

    1.简单的计算文本高度 // 要计算的文本内容 NSString *testString = @"刘成利,软件工程专业毕业,iOS开发者,目前工作于北京,在证券金融领域从事iOS App开发 ...

  7. 数据操作So easy-LINQ解析

    1.LINQ是什么? LINQ是Language Integrated Query的缩写,即“语言集成查询”的意思.LINQ的提出就是为了提供一种跨越各种数据源的统一的查询方式,它主要包含4个组件-- ...

  8. Google Android SDK开发范例------------20141119

    一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...

  9. 反射 介绍System.Type类

    本节先介绍system.Type类,通过这个类可以访问关于任何数据类型的信息. 1. system.Type类以前把Type看作一个类,但它实际上是一个抽象的基类.只要实例化了一个Type对象,实际上 ...

  10. 初步认识 Web Service

     Web Service初步认识   Web Service:不是框架,不是一种技术,而是一种跨平台,跨语言的规范. 作用:异构平台之间的交互,解决了不同平台,不同语言所编写的应用之间的相互调用.(远 ...