crc.hpp
#ifndef __CRC_H__
#define __CRC_H__
#include <iostream>
#include <string.h>
#include "unitHead.h"
template<class POLYTYPE,class T2>
class Crc
{
public:
explicit Crc();
explicit Crc(u8* Src,u32 Len);
virtual ~Crc();
void run();
void setBuff(u8* buffs);
u8* getBuff();
void setBuffLen(u32 Len);
u32 getBuffLen();
void setPoly(POLYTYPE polys);
POLYTYPE getPoly();
private:
POLYTYPE poly;
POLYTYPE crcCode;
u8* buff;
u32 buffLen;
};
template<class POLYTYPE,class T2>
Crc<POLYTYPE,T2>::Crc()
{
}
template<class POLYTYPE,class T2>
Crc<POLYTYPE,T2>::Crc(u8* Src,u32 Len)
{
buff=Src;
buffLen=Len;
}
template<class POLYTYPE,class T2>
Crc<POLYTYPE,T2>::~Crc()
{
}
template<class POLYTYPE,class T2>
void Crc<POLYTYPE,T2>::run()
{
std::cout<<"Crc.run()"<<std::endl;
std::cout<<"Crc.buff: "<<buff<<std::endl;
std::cout<<"Crc.buffLen: "<<buffLen<<std::endl;
std::cout<<"Crc.strlen: "<<strlen((char*)buff)<<std::endl;
std::cout<<"Crc.poly: "<<poly<<std::endl;
u32 tempI=buffLen;
POLYTYPE data=0;
POLYTYPE bitCheck=0;
int bitNum=sizeof(data);
switch (bitNum)
{
case 4:
//crc32
bitCheck=0x80000000;
break;
case 2:
//crc16
bitCheck=0x8000;
break;
case 1:
//crc8
bitCheck=0x80;
break;
default:
break;
}
crcCode=0;
while(tempI--)
{
//crc:
data=*(buff++);
std::cout<<"Crc.data: "<<+data<<std::endl;
crcCode=crcCode^data<<(8*(bitNum-1));
for(int i=0;i<8;i++)
{
if(crcCode&bitCheck)//0x80 -crc8
{
crcCode=(crcCode<<1)^poly;
}
else
{
crcCode<<=1;
}
}
}
std::cout<<"Crc.crcCode: "<<+crcCode<<std::endl;
}
template<class POLYTYPE,class T2>
void Crc<POLYTYPE,T2>::setBuff(u8* buffs)
{
this->buff=buffs;
}
template<class POLYTYPE,class T2>
u8* Crc<POLYTYPE,T2>::getBuff()
{
return buff;
}
template<class POLYTYPE,class T2>
void Crc<POLYTYPE,T2>::setBuffLen(u32 Len)
{
this->buffLen=Len;
}
template<class POLYTYPE,class T2>
u32 Crc<POLYTYPE,T2>::getBuffLen()
{
return buffLen;
}
template<class POLYTYPE,class T2>
void Crc<POLYTYPE,T2>::setPoly(POLYTYPE polys)
{
this->poly=polys;
}
template<class POLYTYPE,class T2>
POLYTYPE Crc<POLYTYPE,T2>::getPoly()
{
return poly;
}
#endif
unithead.h
#ifndef __UNITHEAD_H__
#define __UNITHEAD_H__
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#endif
main.cpp
#include <iostream>
#include "crc.hpp"//crc运算类
using namespace std;
void testCrc8(char **argv);
void testCrc16(char **argv);
void testCrc32(char **argv);
int getLen(char* str);
int main(int argc,char** argv)
{
if(argc<=1){
cout<<"???argv[1]???"<<endl;
return 0;
}
testCrc8(argv);
testCrc16(argv);
testCrc32(argv);
return 0;
}
void testCrc8(char **argv)
{
Crc<u8,u8> *mCrc8 = new Crc<u8,u8>();
u8 tmp8=0;
u8 poly=7;
u32 tmp32=0;
mCrc8->setBuff((unsigned char *)(argv[1]));
mCrc8->setBuffLen(getLen(argv[1]));
mCrc8->setPoly(poly);
mCrc8->run();
cout<<argv[1]<<endl;
}
void testCrc16(char **argv)
{
Crc<u16,u16> *mCrc8 = new Crc<u16,u16>();
u8 tmp8=0;
u16 poly=7;
u32 tmp32=0;
mCrc8->setBuff((unsigned char *)(argv[1]));
mCrc8->setBuffLen(getLen(argv[1]));
mCrc8->setPoly(poly);
mCrc8->run();
cout<<argv[1]<<endl;
}
void testCrc32(char **argv)
{
Crc<u32,u32> *mCrc8 = new Crc<u32,u32>();
u8 tmp8=0;
u32 poly=7;
u32 tmp32=0;
mCrc8->setBuff((unsigned char *)(argv[1]));
mCrc8->setBuffLen(getLen(argv[1]));
mCrc8->setPoly(poly);
mCrc8->run();
cout<<argv[1]<<endl;
}
int getLen(char* str)
{
char *p = str;
int count = 0;
while (*p++ != '\0')
{
count++;
}
return count;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(test)
include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/src)
add_executable(
demo
${CMAKE_SOURCE_DIR}/src/main.cpp
)
献上tree:
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── demo
│ └── Makefile
├── CMakeLists.txt
├── include
│ ├── crc.hpp
│ └── unitHead.h
└── src
└── main.cpp
完整演示demo链接: