登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

梦想之鹰的天空

天高任鸟飞......放飞....心情..........放飞.....梦想

 
 
 

日志

 
 

循环冗余校验码CRC算法的C++实现  

2011-12-28 12:06:35|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。

完整的CRC-32标准所包含的内容:

引用
Name            : "CRC-32"
Width           : 32
Poly            : 04C11DB7
Initial value   : FFFFFFFF
Reflected       : True
XOR out with    : FFFFFFFF


下面是CRC-16标准:

引用
Name            : "CRC-16"
Width           : 16
Poly            : 8005
Initial value   : 0000
Reflected       : True
XOR out with    : 0000


下面的多项式值的得到,是通过对Poly逆向计算得到的:

引用

0000 0100 1100 0001 0001 1101 1011 0111-->
0    4    C    1    1    D    B    7     |========04C11DB7
<-----------------------------------------
1110 1101 1011 1000 1000 0011 0010 0000
E    D    B    8     8   3    2    0      ========EDB88320


具体实现如下:
view plaincopy to clipboardprint?
/* 
 *  函数名:GetCrc32 
 *  函数原型:unsigned int GetCrc32(char* InStr,unsigned int len) 
 *      参数:InStr  ---指向需要计算CRC32值的字符串 
 *          len  ---为InStr的长度 
 *      返回值为计算出来的CRC32结果。 
 * 
 *  函数名:GetCrc16 
 *  函数原型:unsigned short GetCrc16(char* InStr,unsigned int len) 
 *      参数:InStr  ---指向需要计算CRC32值的字符串 
 *          len  ---为InStr的长度 
 *      返回值为计算出来的CRC32结果。 
 * 
 *    2009/03/26   Edit By iawen 
 * 
 */ 
   
#include"GetCrcValue.h"  
 
unsigned int GetCrc32(char* InStr,unsigned int len){     
  //生成Crc32的查询表  
  unsigned int Crc32Table[256];   
  int i,j;     
  unsigned int Crc;     
  for (i = 0; i < 256; i++){     
    Crc = i;     
    for (j = 0; j < 8; j++){     
      if (Crc & 1)     
        Crc = (Crc >> 1) ^ 0xEDB88320;     
      else    
        Crc >>= 1;   
    }     
    Crc32Table[i] = Crc;     
  }     
 
  //开始计算CRC32校验值  
  Crc=0xffffffff;     
  for(int i=0; i<len; i++){       
    Crc = (Crc >> 8) ^ Crc32Table[(Crc & 0xFF) ^ InStr[i]];     
  }  
    
  Crc ^= 0xFFFFFFFF;  
  return Crc;     
}     
 
unsigned short GetCrc16(char* InStr,unsigned int len){     
  //生成Crc16的查询表  
  unsigned short Crc16Table[256];   
  unsigned int i,j;  
  unsigned short Crc;     
  for (i = 0; i < 256; i++){    
    Crc = i;     
    for (j = 0; j < 8; j++){     
      if(Crc & 0x1)     
        Crc = (Crc >> 1) ^ 0xA001;     
      else    
        Crc >>= 1;   
    }     
    Crc16Table[i] = Crc;     
  }  
    
  //开始计算CRC16校验值  
  Crc=0x0000;       
  for(i=0; i<len; i++){       
    Crc = (Crc >> 8) ^ Crc16Table[(Crc & 0xFF) ^ InStr[i]];    
 
  }  
  //Crc ^= 0x0000;    
  return Crc;     
}   
/*
 *  函数名:GetCrc32
 *  函数原型:unsigned int GetCrc32(char* InStr,unsigned int len)
 *      参数:InStr  ---指向需要计算CRC32值的字符串
 *          len  ---为InStr的长度
 *      返回值为计算出来的CRC32结果。
 *
 *  函数名:GetCrc16
 *  函数原型:unsigned short GetCrc16(char* InStr,unsigned int len)
 *      参数:InStr  ---指向需要计算CRC32值的字符串
 *          len  ---为InStr的长度
 *      返回值为计算出来的CRC32结果。
 *
 *    2009/03/26   Edit By iawen
 *
 */
 
#include"GetCrcValue.h"

unsigned int GetCrc32(char* InStr,unsigned int len){  
  //生成Crc32的查询表
  unsigned int Crc32Table[256];
  int i,j;  
  unsigned int Crc;  
  for (i = 0; i < 256; i++){  
    Crc = i;  
    for (j = 0; j < 8; j++){  
      if (Crc & 1)  
        Crc = (Crc >> 1) ^ 0xEDB88320;  
      else 
        Crc >>= 1;
    }  
    Crc32Table[i] = Crc;  
  }  

  //开始计算CRC32校验值
  Crc=0xffffffff;  
  for(int i=0; i<len; i++){    
    Crc = (Crc >> 8) ^ Crc32Table[(Crc & 0xFF) ^ InStr[i]];  
  }
 
  Crc ^= 0xFFFFFFFF;
  return Crc;  
}  

unsigned short GetCrc16(char* InStr,unsigned int len){  
  //生成Crc16的查询表
  unsigned short Crc16Table[256];
  unsigned int i,j;
  unsigned short Crc;  
  for (i = 0; i < 256; i++){ 
    Crc = i;  
    for (j = 0; j < 8; j++){  
      if(Crc & 0x1)  
        Crc = (Crc >> 1) ^ 0xA001;  
      else 
        Crc >>= 1;
    }  
    Crc16Table[i] = Crc;  
  }
 
  //开始计算CRC16校验值
  Crc=0x0000;    
  for(i=0; i<len; i++){    
    Crc = (Crc >> 8) ^ Crc16Table[(Crc & 0xFF) ^ InStr[i]]; 

  }
  //Crc ^= 0x0000; 
  return Crc;  

调用示例代码:
view plaincopy to clipboardprint?
#include<iostream>  
#include"GetCrcValue.h"  
using namespace std;  
 
int main(){  
  char str[]="iawen";  
  unsigned int crc=GetCrc32(str,5);  
    
  printf("%08X\n",crc);  
    
  crc=GetCrc16(str,5);//0x5359  
  printf("%04X\n",crc);  
  return 0;  


转自:IaWeN's Blog-iawen,原创,安全,破解视频,网页设计,影视后期,AE特效
链接:http://www.iawen.com/read.php?242

  评论这张
 
阅读(667)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018