crc公式法.主打理解.供学习使用.使用时注意设置内容.

本文介绍了一个使用C++编写的CRC校验类模板,展示了如何创建不同位宽(CRC8、CRC16、CRC32)的实例,并在main.cpp中通过命令行参数调用。CMakeLists.txt文件用于构建项目。
摘要由CSDN通过智能技术生成
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链接:

crc.hpp_demo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值