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

📄 crc.c

📁 CRC16和CRC32
💻 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 + -