完整的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; iCrc = (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; iCrc = (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