循环冗余校验码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

具体实现如下:

/*
*  函数名: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    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    Crc = (Crc >> 8) ^ Crc16Table[(Crc & 0xFF) ^ InStr[i]];  

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


调用示例代码:

#include
#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;
}


在命令行下编译:
cl test.cpp GetCrcValue.cpp /EHsc

具体的说明与实现见附件:
CRC.rar