📄 crc16.c
字号:
/* FILE: crc.c */
#include "crc.h"
CRC_TYPE crc( unsigned char *ptr, register int len )
{
static int tblInitialized = 0;
static CRC_TYPE crcReg, crcTbl[ 256 ];
unsigned long i, j, k;
if( !tblInitialized ){ /* init crc lookup table only once */
#ifdef CRC8
for( i=0; i < 256; i++ ){
j = i;
for( k=8; k--; ){
j = j & 0x80? (j << 1) ^ POLY : j << 1;
}
crcTbl[ i ] = (CRC_TYPE)j;
}
#endif
#ifdef CRC10
for( i=0; i < 256; i++ ){
j = i << 2;
for( k=8; k--; ){
if( (j <<= 1) & 0x0400 ){
j ^= POLY;
}
}
crcTbl[ i ] = (CRC_TYPE)j;
}
#endif
#ifdef XMODEM
for( i=0; i < 256; i++ ){
j = i << 8;
for( k=8; k--; ){
j = j & 0x8000? (j << 1) ^ POLY : j << 1;
}
crcTbl[ i ] = (CRC_TYPE)j;
}
#endif
// #ifdef X25 || CRC16 || MILSTD188 || AUTODINII
#ifdef CRC16
for( i=0; i < 256; i++ ){
j = i;
for( k=8; k--; ){
j = j & 1? (j >> 1) ^ POLY : j >> 1;
}
crcTbl[ i ] = (CRC_TYPE)j;
}
#endif
tblInitialized = 1;
} /* end of if(!tblInitialized) */
crcReg = CRC_INIT; /* always init register */
/* calc CRC */
for( ;len--; ){
#ifdef CRC8
crcReg = crcTbl[ crcReg ^ *ptr++ ];
#endif
#ifdef CRC10
crcReg = (CRC_TYPE)(((crcReg << 8) & 0x3ff) ^
crcTbl[ ((crcReg >> 2) & 0x00ff) ] ^ *ptr++ );
#endif
#ifdef XMODEM
crcReg = (CRC_TYPE)((crcReg << 8) ^
crcTbl[ ((crcReg >> 8) & 0x00ff) ^ *ptr++ ]);
#endif
// #ifdef X25 || CRC16 || MILSTD188 || AUTODINII
#ifdef CRC16
crcReg = (CRC_TYPE)((crcReg >> 8) ^
crcTbl[ (crcReg ^ *ptr++) & 0x00ff ]);
#endif
}
/* finish up and return */
#ifdef CRC10
/* flush out with two NULL bytes */
for( len=2; len--; ){
crcReg = (CRC_TYPE)(((crcReg << 8) & 0x3ff) ^
crcTbl[ ((crcReg >> 2) & 0x00ff) ] );
}
return( crcReg );
#endif
#ifdef X25
/* complement and swap bytes */
return( ~(((crcReg & 0xff) << 8) | (crcReg >> 8)) );
#endif
#ifdef AUTODINII
/* complement without swap */
return( ~crcReg );
#endif
// #ifdef CRC8 || CRC16 || XMODEM || MILSTD188
#ifdef CRC16
return( crcReg );
#endif
} /* end of crc() */
CRC_TYPE xmodem_crc_byte( UINT8 *ptr, int len )
{
CRC_TYPE crcReg;
UINT8 tmp, locrc, hicrc;
crcReg = CRC_INIT;
for( ;len--; ){
hicrc = (UINT8) crcReg;
locrc = (UINT8) (crcReg >> 8);
tmp = locrc ^= *ptr++;
locrc ^= ((tmp >> 4) & 0x0f);
hicrc ^= ((locrc & 0x0f) << 4);
hicrc ^= (locrc >> 3) & 0x1f;
locrc ^= (locrc << 5) & 0xe0;
crcReg = (CRC_TYPE) (hicrc << 8) | locrc;
}
return( crcReg );
}
void main(void)
{
CRC_TYPE crcValue;
crcValue = crc( "THE", 3 );
crcValue = crcValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -