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

📄 crc16.c

📁 税控检测用的crc
💻 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 + -