www.pudn.com > 税控检测用的crc.rar > 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; 
}