循环冗余校验码CRC算法的C++实现 循环冗余校验码例题
完整的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("%08Xn",crc);
crc=GetCrc16(str,5);//0x5359
printf("%04Xn",crc);
return 0;
}
更多阅读
pid算法的c语言实现和升级 fuzzypid的c语言算法
struct _pid{ floatSetSpeed;//定义设定值 floatActualSpeed;//定义实际值 floaterr;//定义偏差值 floaterr_last;//定义上一个偏差值 floatKp,Ki,Kd;//定义比例、积分、微分系数 floatvoltage;//定义电压值(控制执行器的变量) floati
简述简单遗传算法的基本原理和一般过程,说明个体选择的常用策略 遗传算法的个体初始化
(1)简单遗传算法SGA的基本原理是:首先把问题的解表示成“染色体”,即以二进制编码的串。在执行遗传算法之前,给出一群“染色体”(串),即假设解。然后,把这些假设解至于问题的“环境”中,并按适者生存的原则,从中选择出较能适应环境的“染色体”
穷追非明码算法的注册码+算法注册机|一蓑烟雨论坛|UpkSafe|Upk安 算法注册机
【文章标题】: 穷追非明码算法的注册码+算法注册机【文章作者】: BeyondMe【作者邮箱】: futuring@126.com【作者主页】: http://hi.baidu.com/beyond0769【软件名称】: Flash Screensaver Maker Simple Version V3.7【下载地址】: h
遗传算法的VB实现代码 中 matlab实现遗传算法
************************************ 随机全局取样选择 **********************************''过 程 名: Stochastic_Universal_Sampleing'参 数: BinGroup - 染色体数据' Result - 染色体的适应度数据' N - 联赛规模,没有考虑到代沟
ECC算法的详细说明 sm2国密算法
今天本来是想写NAND的读写来着,可是这个东东要用到ECC的算法,就深入进来了,从网上找了些资料,不是很好,直到找到这个,郑重感谢Linux时代网站的wwxbei (旺旺) ,在黑暗中点亮了指明方向的路灯。http://linux.chinaunix.net/bbs/viewthread