Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1808158
  • 博文数量: 195
  • 博客积分: 4227
  • 博客等级: 上校
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-04 10:39
文章分类

全部博文(195)

文章存档

2013年(1)

2012年(26)

2011年(168)

分类: LINUX

2011-05-30 21:45:55

CRC校验

一.前言

还是回顾以前的老知识了,现在对于一句话更加的深有体会了,好记性不如烂笔头。关于CRC校验还是去年的这个时候理解的,到现在已经忘完了。今天因为看SDIO中看到CRC校验,故重新回顾了一下。

二.原理

任意一个二进制的位串可以用系数仅为0,1的多项式表示。如101011,其表示多项式为x^4+x^2+x^1+1.

三.编码

设码字长度为Nbit,信息字段为Kbit而校验字段为Rbit(N=K+R),对于CRC,码集中的任一码字,存在并且仅存在一个R次的多项式g(x),使得:

V(x) =A(x)g(x)=x^R*m(x)+r(x);

其中:m(x)K次信息多项式 r(x)R-1位的校验码 g(x)为生成多项式

发送方通过g(x)形成校验码,接收方通过g(x)验证接受码。

四.CRC计算

1.手算

CRC的计算就是采用了多项式的除法(不进位),也就是异或的办法实现。

2.采用查询

就是将每一个值所对应的CRC码预先计算出来,而后采用查询的办法实现。

五.Code


  1. #include <iostream>

  2.  

  3. using namespace std;

  4.  

  5. #define u8 unsigned char

  6. #define u16 unsigned short

  7. #define u32 unsigned int

  8. #define crc4 0x19 //v(x)=x^4+x^3+1

  9. #define crc4_mod 0xC100

  10. #define crc4_12 0xC10

  11. u32 Cal_CRC(u8 *src,u8 len)

  12. {

  13.          u32 crc =0;

  14.          u8 i,j=0;

  15.          u16 reg=0;

  16.          while(j != len){

  17.                    printf("%d\n",j);

  18.                    reg = reg|src[j];

  19.                    for(i=0;i<8;i++){

  20.                             if(reg&0x8000){

  21.                                      reg = reg^crc4_mod;

  22.                                      reg <<= 1;

  23.                             }

  24.                             else{

  25.                                      reg <<=1;

  26.                             }

  27.                    }

  28.                    j++;

  29.          }

  30.          reg=reg>>4;

  31.          for(i=0;i<8;i++)

  32.          {

  33.                    if(reg&0x800){

  34.                             reg = reg^crc4_12;

  35.                             reg <<= 1;

  36.                    }

  37.                    else{

  38.                             reg <<=1;

  39.                    }

  40.          }

  41.          reg = reg>>8;

  42.          if(reg >crc4){

  43.                    reg = reg^crc4;

  44.          }

  45.          return reg;

  46. }

  47.  

  48. int main(void)

  49. {

  50.          u32 crc;

  51.          u8 src[4] ={0xAA,0xAA,0xAA};

  52.          crc = Cal_CRC(src,2);

  53.          cout<<crc<<endl;

  54.          return 0;

  55. }

 

阅读(1032) | 评论(0) | 转发(0) |
0

上一篇:Android移植之WIFI

下一篇:Linux系统调用列表

给主人留下些什么吧!~~