打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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;  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CRC算法
CRC32(c语言 源码)
计算机、单片机(M16)收、发自如modbus
【原】以太网帧FCS校验码CRC32的三种实现方法
32位CRC校验代码及其应用
探究CRC32算法实现原理-why table-driven implemention
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服