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

*

*/
循环冗余校验码CRC算法的C++实现 循环冗余校验码例题

#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("%08Xn",crc);

crc=GetCrc16(str,5);//0x5359

printf("%04Xn",crc);

return 0;

}

  

爱华网本文地址 » http://www.413yy.cn/a/25101012/140009.html

更多阅读

pid算法的c语言实现和升级 fuzzypid的c语言算法

struct _pid{ floatSetSpeed;//定义设定值 floatActualSpeed;//定义实际值 floaterr;//定义偏差值 floaterr_last;//定义上一个偏差值 floatKp,Ki,Kd;//定义比例、积分、微分系数 floatvoltage;//定义电压值(控制执行器的变量) floati

遗传算法的VB实现代码 中 matlab实现遗传算法

************************************ 随机全局取样选择 **********************************''过 程 名: Stochastic_Universal_Sampleing'参 数: BinGroup - 染色体数据' Result - 染色体的适应度数据' N - 联赛规模,没有考虑到代沟

ECC算法的详细说明 sm2国密算法

今天本来是想写NAND的读写来着,可是这个东东要用到ECC的算法,就深入进来了,从网上找了些资料,不是很好,直到找到这个,郑重感谢Linux时代网站的wwxbei  (旺旺) ,在黑暗中点亮了指明方向的路灯。http://linux.chinaunix.net/bbs/viewthread

声明:《循环冗余校验码CRC算法的C++实现 循环冗余校验码例题》为网友蘰踄繧鍴分享!如侵犯到您的合法权益请联系我们删除