⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc.cpp

📁 多文档界面设计配置文件读写串口操作串口封装类
💻 CPP
字号:
#include "stdafx.h"#include "CRC.h"#include ".\crc.h"


/*******************************************************************/
/*
  函 数 名 称:	BuildTable16
  功 能 描 述:	创建CRC16所需要的Table
  参 数 说 明:	aPoly[in]:创建表所需要的多项式
				Table_CRC[in][out]:Table表的buff

  返回值 说明:	void
  作       者:	
  更 新 日 期:	
/*******************************************************************/static void BuildTable16( unsigned short aPoly , unsigned long* Table_CRC ){    unsigned short i, j;    unsigned short nData;    unsigned short nAccum;    for ( i = 0; i < 256; i++ )    {        nData = ( unsigned short )( i << 8 );        nAccum = 0;        for ( j = 0; j < 8; j++ )        {            if ( ( nData ^ nAccum ) & 0x8000 )                nAccum = ( nAccum << 1 ) ^ aPoly;            else                nAccum <<= 1;            nData <<= 1;        }        Table_CRC[i] = ( unsigned long )nAccum;    }}/*******************************************************************/
/*
	函 数 名 称:	BuildTable32
	功 能 描 述:	创建CRC32所需要的Table
	参 数 说 明:	aPoly[in]:创建表所需要的多项式
					Table_CRC[in][out]:Table表的buff

	  返回值 说明:	void
	  作       者:	
	  更 新 日 期:	
/*******************************************************************/static void BuildTable32( unsigned long aPoly , unsigned long* Table_CRC ){    unsigned long i, j;    unsigned long nData;    unsigned long nAccum;    for ( i = 0; i < 256; i++ )    {        nData = ( unsigned long )( i << 24 );        nAccum = 0;        for ( j = 0; j < 8; j++ )        {            if ( ( nData ^ nAccum ) & 0x80000000 )                nAccum = ( nAccum << 1 ) ^ aPoly;            else                nAccum <<= 1;            nData <<= 1;        }        Table_CRC[i] = nAccum;    }}/*******************************************************************/
/*
	函 数 名 称:	RunCRC16
	功 能 描 述:	执行对数据段的CRC16循环冗余校验
	参 数 说 明:	aData[in]:待校验数据
					aSize[in]:待校验数据长度
					aPoly[in]:创建表所需要的多项式
					
	  返回值 说明:	循环冗余校验结果
	  作       者:	
	  更 新 日 期:	
/*******************************************************************/unsigned short CCRC::RunCRC16( const unsigned char * aData, unsigned long aSize, unsigned short aPoly ){    unsigned long Table_CRC[256]; // CRC 表    unsigned long  i;    unsigned short nAccum = 0;	BuildTable16( aPoly, Table_CRC );        for ( i = 0; i < aSize; i++ )        nAccum = ( nAccum << 8 ) ^ ( unsigned short )Table_CRC[( nAccum >> 8 ) ^ *aData++];    return nAccum;}/*******************************************************************/
/*
	函 数 名 称:	RunCRC32
	功 能 描 述:	执行对数据段的CRC32循环冗余校验
	参 数 说 明:	aData[in]:待校验数据
					aSize[in]:待校验数据长度
					aPoly[in]:创建表所需要的多项式
					
	  返回值 说明:	循环冗余校验结果
	  作       者:	
	  更 新 日 期:	
/*******************************************************************/unsigned long CCRC::RunCRC32( const unsigned char * aData, unsigned long aSize, unsigned long aPoly ){    unsigned long Table_CRC[256]; // CRC 表    unsigned long i;    unsigned long nAccum = 0;	BuildTable32( aPoly, Table_CRC );        for ( i = 0; i < aSize; i++ )        nAccum = ( nAccum << 8 ) ^ Table_CRC[( nAccum >> 24 ) ^ *aData++];    return nAccum;}

unsigned short CCRC::crcbt(unsigned char *data, unsigned int nlen)
{
	unsigned short fcrc = 0xffff;
	unsigned char fb = 0x0;

	for(unsigned int i = 0;i<=nlen-1;++i)
	{
		fcrc ^= data[i];
		for(unsigned int j = 0;j<=7;++j)
		{
			fb = fcrc & 0x01;
			fcrc = fcrc >> 1;
			if(0x01 == fb)
				fcrc ^= 0xa001;
		}
	}
	return fcrc;
}

unsigned short CCRC::crcdw(unsigned short* data, unsigned int nlen)
{
	unsigned short fcrc = 0xffff;
	unsigned char fb = 0x00;
	for(unsigned int i = 0;i<=nlen*2-1;++i)
	{
		unsigned char ftemp = 0x00;
		if(0 == i%2)
			ftemp = data[i>>1] >> 8;
		else
			ftemp = data[i>>1] & 0xff;
		fcrc ^= ftemp;
		for(unsigned int j = 0;j <= 7;++j)
		{
			fb = fcrc & 0x01;
			fcrc = fcrc >> 1;
			if(0x01 == fb)
				fcrc ^= 0xa001;
		}
	}
	return fcrc;
}

unsigned short CCRC::crcbt_itu(unsigned char *data, unsigned int nlen)
{
	unsigned short fcrc = 0xffff;
	unsigned char fb = 0x0;

	for(unsigned int i = 0;i<=nlen-1;++i)
	{
		fcrc ^= data[i];
		for(unsigned int j = 0;j<=7;++j)
		{
			fb = fcrc & 0x01;
			fcrc = fcrc >> 1;
			if(0x01 == fb)
				fcrc ^= 0x1021;
		}
	}
	return fcrc;
}
unsigned short CCRC::crcdw_itu(unsigned short* data, unsigned int nlen)
{
	unsigned short fcrc = 0xffff;
	unsigned char fb = 0x00;
	for(unsigned int i = 0;i<=nlen*2-1;++i)
	{
		unsigned char ftemp = 0x00;
		if(0 == i%2)
			ftemp = data[i>>1] >> 8;
		else
			ftemp = data[i>>1] & 0xff;
		fcrc ^= ftemp;
		for(unsigned int j = 0;j <= 7;++j)
		{
			fb = fcrc & 0x01;
			fcrc = fcrc >> 1;
			if(0x01 == fb)
				fcrc ^= 0x1021;
		}
	}
	return fcrc;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -