再探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模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...
随机推荐
- C# winCE连接SQL数据库
General network error. Check your network documentation. 错误解决方法 1. public static string Sqlstr = &q ...
- js数组&&字符串&&定时器1
一.简单计算命令eval var str="6*5"; alert(eval(str)); 注意:不安全,一般都不会去用 二.id&&name id:只能唯一 ...
- 解决 phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接 问题
phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接.您应该检查配置文件中的主机.用户名和密码,并确认这些信息与 MySQL 服务器管理员所给出的信息一致. 问题解决办法: 修改co ...
- store procedure 翻页
store procedure 翻页例子 .turn page CREATE PROCEDURE pageTest --用于翻页的测试 --需要把排序字段放在第一列 ( )=null, --当前页面里 ...
- SQL SERVER格式化字符串位数,不足补零
本文举例在SQLSERVER中将1格式化为001的方法: 1.方法一SQL语句执行如下: ,) as col 2.方法二SQL语句执行如下: ,) ,) as col 下面是C#代码实现方法: ; & ...
- iOS Crash文件的解析
iOS Crash文件的解析 开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断.联想起 ...
- 删除Windows右键不用的选项
1.使用QQ电脑管家或者360的,一般都有小工具. 2.管理注册表 █以WindowsXP(SP2)为例,有些右键菜单中的选项你并不常用,或者有些软件已被删除,但其仍然占据着右键菜单.要删除这些无用的 ...
- (LightOJ 1004) Monkey Banana Problem 简单dp
You are in the world of mathematics to solve the great "Monkey Banana Problem". It states ...
- c#写日志方法
//日志内容,文件名 private string writelog(string value,string name ) { string strPath = ""; try { ...
- 检查ftp备份数据完整性及短信告警的shell脚本
发布:thebaby 来源:net [大 中 小] 检查ftp备份数据完整性及短信告警的shell,有需要的朋友可以参考下. 该脚本实现如下的功能: 对远程备份到ftp服务器的数据完整性及 ...