Cyclic Redundancy Check循環(huán)冗余檢驗(yàn),是基于數(shù)據(jù)計(jì)算一組效驗(yàn)碼,用于核對(duì)數(shù)據(jù)傳輸過程中是否被更改或傳輸錯(cuò)誤。
完整的CRC-32標(biāo)準(zhǔn)所包含的內(nèi)容:
引用
Name : "CRC-32"
Width : 32
Poly : 04C11DB7
Initial value : FFFFFFFF
Reflected : True
XOR out with : FFFFFFFF
下面是CRC-16標(biāo)準(zhǔn):
引用
Name : "CRC-16"
Width : 16
Poly : 8005
Initial value : 0000
Reflected : True
XOR out with : 0000
下面的多項(xiàng)式值的得到,是通過對(duì)Poly逆向計(jì)算得到的:
引用
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
具體實(shí)現(xiàn)如下:
view plaincopy to clipboardprint?
/*
* 函數(shù)名:GetCrc32
* 函數(shù)原型:unsigned int GetCrc32(char* InStr,unsigned int len)
* 參數(shù):InStr ---指向需要計(jì)算CRC32值的字符串
* len ---為InStr的長(zhǎng)度
* 返回值為計(jì)算出來的CRC32結(jié)果。
*
* 函數(shù)名:GetCrc16
* 函數(shù)原型:unsigned short GetCrc16(char* InStr,unsigned int len)
* 參數(shù):InStr ---指向需要計(jì)算CRC32值的字符串
* len ---為InStr的長(zhǎng)度
* 返回值為計(jì)算出來的CRC32結(jié)果。
*
* 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;
}
//開始計(jì)算CRC32校驗(yàn)值
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;
}
//開始計(jì)算CRC16校驗(yàn)值
Crc=0x0000;
for(i=0; i<len; i++){
Crc = (Crc >> 8) ^ Crc16Table[(Crc & 0xFF) ^ InStr[i]];
}
//Crc ^= 0x0000;
return Crc;
}
/*
* 函數(shù)名:GetCrc32
* 函數(shù)原型:unsigned int GetCrc32(char* InStr,unsigned int len)
* 參數(shù):InStr ---指向需要計(jì)算CRC32值的字符串
* len ---為InStr的長(zhǎng)度
* 返回值為計(jì)算出來的CRC32結(jié)果。
*
* 函數(shù)名:GetCrc16
* 函數(shù)原型:unsigned short GetCrc16(char* InStr,unsigned int len)
* 參數(shù):InStr ---指向需要計(jì)算CRC32值的字符串
* len ---為InStr的長(zhǎng)度
* 返回值為計(jì)算出來的CRC32結(jié)果。
*
* 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;
}
//開始計(jì)算CRC32校驗(yàn)值
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;
}
//開始計(jì)算CRC16校驗(yàn)值
Crc=0x0000;
for(i=0; i<len; i++){
Crc = (Crc >> 8) ^ Crc16Table[(Crc & 0xFF) ^ InStr[i]];
}
//Crc ^= 0x0000;
return Crc;
}
調(diào)用示例代碼:
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;
}
聯(lián)系客服