📄 crc.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 + -