127 lines
3.2 KiB
C++
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;
|
|
}
|