📄 crc.c
字号:
#include <vxWorks.h>
#define _REScrch
#include <sdk/exlib/crc/crc.h>
/*##################################################################################
define globle variable.
*/
/*##################################################################################
declare funtions.
*/
static void BuildTable16( unsigned short u_poly , unsigned long* Table_CRC );
static void BuildTable32( unsigned long u_poly , unsigned long* Table_CRC );
unsigned short RunCRC16( const unsigned char * u_pData, unsigned long u_dataSize, unsigned short u_poly );
unsigned long RunCRC32( const unsigned char * u_pData, unsigned long u_dataSize, unsigned long u_poly );
/*##################################################################################
define functions.
*/
/* 创建CRC16所需要的Table
参 数: u_poly[in]:创建表所需要的多项式
Table_CRC[in][out]:Table表的buff
返回值: void
*/
static void BuildTable16( unsigned short u_poly , 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 ) ^ u_poly;
else
nAccum <<= 1;
nData <<= 1;
}
Table_CRC[i] = ( unsigned long )nAccum;
}
}
/* 创建CRC32所需要的Table
参 数: u_poly[in]:创建表所需要的多项式
Table_CRC[in][out]:Table表的buff
返回值: void
*/
static void BuildTable32( unsigned long u_poly , unsigned long* Table_CRC )
{
unsigned long c;
int n, k;
for (n = 0; n < 256; n++)
{
c = (unsigned long)n;
for (k = 0; k < 8; k++)
{
c = c & 1 ? u_poly ^ (c >> 1) : c >> 1;
}
Table_CRC[n] = c;
}
}
/* 执行对数据段的CRC16循环冗余校验
参 数: u_pData[in]:待校验数据
u_dataSize[in]:待校验数据长度
u_poly[in]:创建表所需要的多项式
返回值: 循环冗余校验结果
*/
unsigned short RunCRC16( const unsigned char * u_pData, unsigned long u_dataSize, unsigned short u_poly )
{
unsigned long Table_CRC[256];
unsigned long i;
unsigned short nAccum = 0;
BuildTable16( u_poly, Table_CRC );
for ( i = 0; i < u_dataSize; i++ )
{
nAccum = ( nAccum << 8 ) ^ ( unsigned short )Table_CRC[( nAccum >> 8 ) ^ *u_pData++];
}
return nAccum;
}
/* 执行对数据段的CRC32循环冗余校验
参 数: u_pData[in]:待校验数据
u_dataSize[in]:待校验数据长度
u_poly[in]:创建表所需要的多项式
返回值: 循环冗余校验结果
*/
unsigned long RunCRC32( const unsigned char * u_pData, unsigned long u_dataSize, unsigned long u_poly )
{
unsigned long Table_CRC[256];
unsigned long i;
unsigned long nAccum = 0;
BuildTable32( u_poly, Table_CRC );
nAccum = nAccum ^ 0xffffffff;
for ( i = 0; i < u_dataSize; i++ )
{
nAccum = Table_CRC[((int)nAccum ^ (*u_pData++)) & 0xff] ^ (nAccum >> 8);
}
return nAccum ^ 0xffffffff;
}
/* 执行对数据段的CRC16循环冗余校验
参 数:u_pCrcData:待校验数据
u_crcSize:待校验数据长度
返回值: 循环冗余校验结果
说 明: 多项式,0x1021
*/
unsigned short int checkCRC16( unsigned char * u_pCrcData, unsigned long u_crcSize)
{
return RunCRC16(u_pCrcData, u_crcSize, CRC16_CCITT);
}
/* 执行对数据段的CRC32循环冗余校验
参 数:u_pCrcData:待校验数据
u_crcSize:待校验数据长度
返回值: 循环冗余校验结果
说 明:多项式为,0xEDB88320
*/
unsigned long checkCRC32( unsigned char * u_pCrcData, unsigned long u_crcSize)
{
return RunCRC32(u_pCrcData, u_crcSize, CRC32_DEFAULT_V);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -