2024-06-23 17:36:53 +08:00

127 lines
3.2 KiB
C++

#include "stdafx.h"
#include "CRC.h"
/*******************************************************************/
/*
函 数 名 称: BuildTable16
功 能 描 述: 创建CRC16所需要的Table
参 数 说 明: aPoly[in]:创建表所需要的多项式
Table_CRC[in][out]:Table表的buff
返回值 说明: void
更 新 日 期: 2003.12.19
/*******************************************************************/
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 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 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;
}