之前写了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的更多相关文章

  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. JQuery设置input属性(disabled、enabled)

    document.getElementById("removeButton").disabled = false; //普通Js写法 $("#removeButton&q ...

  2. 如何关闭SELinux

    一般安装linux课程时都把SELinux与iptables安排在后面,使初学者配置linux服务器时不成功,却没有头绪,那是因为在RedHat linux操作系统中默认开启了防火墙,SELinux也 ...

  3. Jquery CheckBox复选框 全选/取消全选 最佳实现方式 参考案例

    <input id="chkAll" type="checkbox" />全选/取消全选</div> <asp:Repeater ...

  4. vmstat,iostat,sar命令详解

    Procs r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数.此数由 linux 计算得出,但 linux 并不耗尽交换空间 Memory swpd: 虚拟内 ...

  5. OC - 3.OC的三大特性

    一.封装 1> 封装的定义 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别 2> 封装的好处 可以通过set方法防止为成员变量设置不合理的值 仅向外部提供公 ...

  6. iOS app提交审核 11.13条款问题

    今年开年到现在.提交app应用一直招拒,这个问题我想不明白,感觉就是一个坑.所以贴出来给大家看看. 发件人 Apple11.13 - Apps that link to external mechan ...

  7. redis基本数据类型【1】-String类型

    1.赋值与取值 set key value get key 2.设置自增 #自增1 incr num #指定增长跨度 incrby num 10 设置自减 #自增1 decr num #指定增长跨度 ...

  8. 加载jar文件输出class和method

    package file import java.util.jar.JarEntry import java.util.jar.JarFile import org.junit.Test; class ...

  9. nodejs 实现机制

    最近在学习nodejs,作为一个从未学过javascript的程序员,把自己学习的过程贴出来,当做记录和总结吧. 1. nodejs的原理: nodejs完全是基于事件轮询机制的一个javascrip ...

  10. (转 部分修改) IOS 手势密码(简单版)

    // // Created by wangtouwang on 15/4/7. // Copyright (c) 2015年 wangtouwang. All rights reserved. // ...