再探CRC
之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重温一遍,一下就通了。笔记如下
CRC我没记错的话是Cyclic Redundancy Code,Cyclic和Redundancy非常传神,所谓冗余就是附加的信息,这就是计算下面的原始数据时为什么原始数据要左移四位的原因,

/************************************************************************
*
* The simplest CRC implement algorithm.
*
************************************************************************/
/************************************************************************
Load the register with zero bits.
Augment the message by appending W zero bits to the end of it.
While (more message bits)
Begin
Shift the register left by one bit, reading the next bit of the augmented message into register bit position 0.
If (a 1 bit popped out of the register during step 3)
Register = Register XOR Poly.
End
The register now contains the remainder.
************************************************************************/
#include <stdio.h>
#define POLY 0x13
int main()
{
// the data
unsigned short data = 0x035b;
// load the register with zero bits
unsigned short regi = 0x0000;
// augment the data by appending W(4) zero bits to the end of it.
data <<= ;
// we do it bit after bit
; cur_bit >= ; -- cur_bit )
{
// test the highest bit which will be poped later.
// in fact, the 5th bit from right is the hightest bit here
) & 0x0001 ) == 0x1 ) //凑够5位数(与被除数即生成多项式的位数一样),模2除
{
regi = regi ^ POLY;
}
// shift the register regi <<= 1;
// reading the next bit of the augmented data
unsigned short tmp = ( data >> cur_bit ) & 0x0001;
regi |= tmp;
}
// and now, register contains the remainder which is also called CRC value.
;
}
以上程序就是上面照片里算法的模拟实现,步骤完全一致。
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
Original message :
Poly :
Message after appending W zeros :
Now we simply divide the augmented message by the poly using CRC
arithmetic. This is the same division as before:
= Quotient (nobody cares about the quotient)
_______________
) = Augmented message ( + )
=Poly ,,.,,....
-----,,.,,....
,.,,.... //每一次的余数就是寄存器里的当前值,这里寄存器已经左移了一位,
//读入一位新数据
,.,,....
-----,.,,....
.,,.... //首位为0,寄存器内值比除数小,则继续读入下一位
.,,....
-----.,,....
,,....
,,....
-----,,....
,....
,....
-----,....
....
....
-----....
...
...
-----...
..
..
-----..
.
.
-----.
-----
= 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的更多相关文章
- 再探CRC(转)
源:http://hi.baidu.com/skystalker/item/228a263147f74e87f5e4ad8d 之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重 ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- Spark Streaming揭秘 Day7 再探Job Scheduler
Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...
- 再探ASP.NET 5(转载)
就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- 第四节:SignalR灵魂所在Hub模型及再探聊天室样例
一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...
随机推荐
- 搭建用友开发环境(基于碧桂园的nchome)
1.解压uap_studio6.3 2.授权 3.解压ufjdk.rar到指定路径 4.配置java的环境变量 5.解压BGY50602.7z到指定目录 6.然后在studio中导入BYG5002 7 ...
- 盘点 Github 所用到的开源项目
http://www.php100.com/html/it/mobile/2014/0401/6736.html 在致力于开源事业的同时,Github也使用一些非常优秀的开源项目的来打造自己的平台与服 ...
- groupBy
public List groupBy(List list,String flag,String... sortName) throws Exception{ Map<String,List&l ...
- cognos 10.2.2 Framework manager使用”数据源”新建查询主题
又做了一个简单的报表,就是在Framework Manager中写个sum()的sql出个报表,可以使用使用"数据源"新建查询主题 配置查询主题后修改SQL,注意全部都是大写,要和 ...
- 怎样区分JQuery对象和Dom对象 常用的写法
第一步,http://www.k99k.com/jQuery_getting_started.html 第二步,新手先仔细得全部看一遍jQuery的选择器,很重要!!! (http://shawphy ...
- C语言——N个人围成一圈报数淘汰问题
<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? ...
- java之内存管理
对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于:是否还有引用变量引用该对象,只要有引用变量引用该对象,垃圾回收机制就不会回收它. 强引用:创建一个对象,并把这个对象赋给一个引用变量.这种引用 ...
- 第4章 管道与FIFO
4.1 概述 管道只在亲缘进程间使用,FIFO在任意进程间使用 4.2 管道 #include <unistd.h> ]) fd[0]用来读管道,fd[1]用来写管道 1)命令who | ...
- LINQ to Entities 查询注意事项
1> 排序信息丢失 如果在排序操作之后执行了任何其他操作,则不能保证这些附加操作中会保留排序结果.这些操作包括 Select 和 Where 等.另外,采用表达式作为输入参数的 First 和 ...
- XSS漏洞(跨站脚本)
不要轻信用户提交上来的数据alert消息太难看,因此开发一个aspx页面用来统一展示消息ShowMessage.ashx //主页将判断重定向到另一个页面 if (TextBox1.Text != & ...