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

📄 crc.c

📁 CRC 校验算法的三种实现方式 全部为C代码
💻 C
字号:
// CRC 校验的相关算法


// 半字节CRC校验算法
/* CRC 半字节余式表 */
unsigned int code crc_ta[16]={ 0X0000,0X1021,0X2042, 0X3063, 0X4084, 0X50A5, 0X60C6, 0X70E7, 0X8108,0X9129,0XA14A,0XB16B,0XC18C,0XD1AD,0XE1CE,0XF1EF, }; 
unsigned int halfBcal_crc(unsigned char *ptr, unsigned char len)
{
	unsigned int crc;
	unsigned char da; 
	crc=0;
	while(len--!=0)
	{ 
		// da=((uchar)(crc/256))/16;						/* 暂存CRC 的高四位 */
		da = ((unsigned char)(crc>>8))>>4; 
		crc <<= 4;											/* CRC 右移4 位,相当于取CRC 的低12 位)*/
		crc ^= crc_ta[da^(*ptr/16)];							/* CRC 的高4 位和本字节的前半字节相加后查表计算CRC, 然后加上上一次CRC 的余数 */
		da = ((unsigned char)(crc>>8))>>4;					/* 暂存CRC 的高4 位 */
		crc <<= 4;											/* CRC 右移4 位, 相当于CRC 的低12 位) */
		crc ^= crc_ta[da^(*ptr&0x0f)];						/* CRC 的高4 位和本字节的后半字节相加后查表计算CRCH缓笤偌由仙弦淮蜟RC 的余数 */ ptr++;
	}
	return(crc); 
} 


// 位计算 CRC算法
const code Ploy=0x1021; 
unsigned int bitcal_crc(unsigned char *ptr, unsigned char len)
{
	unsigned char i;
	unsigned int crc=0;
	while(len--!=0) 
	{ 
		for(i=0x80; i!=0; i/=2) 
		{ 
			if((crc&0x8000)!=0) 
			{
				crc<<=1;
				crc^=0x1021;
			} /* 余式CRC 乘以2 再求CRC */ 
			else
				crc<<=1;
			if((*ptr&i)!=0) 
				crc^=Ploy; /* 再加上本位的CRC */ 
		}
		ptr++; 
	} 
	return(crc);
}




// 查表 CRC 算法
/* CRC 余式表 */
unsigned int code crc_tab[256]={  0X0000, 0X1021, 0X2042, 0X3063, 0X4084, 0X50A5, 0X60C6, 0X70E7, 0X8108, 0X9129, 0XA14A, 0XB16B, 0XC18C, 0XD1AD, 0XE1CE, 0XF1EF, 0X1231, 0X0210, 0X3273, 0X2252, 0X52B5, 0X4294, 0X72F7, 0X62D6, 0X9339, 0X8318, 0XB37B, 0XA35A, 0XD3BD, 0XC39C, 0XF3FF, 0XE3DE, 0X2462, 0X3443, 0X0420, 0X1401, 0X64E6, 0X74C7, 0X44A4, 0X5485, 0XA56A,0XB54B, 0X8528, 0X9509, 0XE5EE, 0XF5CF, 0XC5AC, 0XD58D, 0X3653, 0X2672, 0X1611, 0X0630, 0X76D7, 0X66F6, 0X5695, 0X46B4, 0XB75B,0XA77A, 0X9719, 0X8738, 0XF7DF, 0XE7FE, 0XD79D, 0XC7BC, 0X48C4,0X58E5, 0X6886, 0X78A7, 0X0840, 0X1861, 0X2802, 0X3823, 0XC9CC, 0XD9ED, 0XE98E, 0XF9AF, 0X8948, 0X9969, 0XA90A, 0XB92B, 0X5AF5, 0X4AD4, 0X7AB7, 0X6A96, 0X1A71, 0X0A50, 0X3A33, 0X2A12, 0XDBFD, 0XCBDC, 0XFBBF, 0XEB9E, 0X9B79, 0X8B58, 0XBB3B, 0XAB1A, 0X6CA6, 0X7C87, 0X4CE4, 0X5CC5, 0X2C22, 0X3C03, 0X0C60, 0X1C41, 0XEDAE, 0XFD8F, 0XCDEC, 0XDDCD, 0XAD2A, 0XBD0B, 0X8D68, 0X9D49, 0X7E97, 0X6EB6, 0X5ED5, 0X4EF4, 0X3E13, 0X2E32, 0X1E51, 0X0E70, 0XFF9F, 0XEFBE, 0XDFDD, 0XCFFC, 0XBF1B, 0XAF3A, 0X9F59, 0X8F78, 0X9188, 0X81A9, 0XB1CA, 0XA1EB, 0XD10C, 0XC12D, 0XF14E, 0XE16F, 0X1080, 0X00A1, 0X30C2, 0X20E3, 0X5004, 0X4025, 0X7046, 0X6067, 0X83B9, 0X9398, 0XA3FB, 0XB3DA, 0XC33D, 0XD31C, 0XE37F, 0XF35E, 0X02B1, 0X1290, 0X22F3, 0X32D2, 0X4235, 0X5214, 0X6277, 0X7256, 0XB5EA, 0XA5CB, 0X95A8, 0X8589, 0XF56E, 0XE54F, 0XD52C, 0XC50D, 0X34E2, 0X24C3, 0X14A0, 0X0481, 0X7466, 0X6447, 0X5424, 0X4405, 0XA7DB, 0XB7FA, 0X8799, 0X97B8, 0XE75F, 0XF77E, 0XC71D, 0XD73C, 0X26D3, 0X36F2, 0X0691, 0X16B0, 0X6657, 0X7676, 0X4615, 0X5634, 0XD94C, 0XC96D, 0XF90E, 0XE92F, 0X99C8, 0X89E9, 0XB98A, 0XA9AB, 0X5844, 0X4865, 0X7806, 0X6827, 0X18C0, 0X08E1, 0X3882, 0X28A3, 0XCB7D, 0XDB5C, 0XEB3F, 0XFB1E, 0X8BF9, 0X9BD8, 0XABBB, 0XBB9A, 0X4A75, 0X5A54, 0X6A37, 0X7A16, 0X0AF1, 0X1AD0, 0X2AB3, 0X3A92, 0XFD2E, 0XED0F, 0XDD6C, 0XCD4D, 0XBDAA, 0XAD8B, 0X9DE8, 0X8DC9, 0X7C26, 0X6C07, 0X5C64, 0X4C45, 0X3CA2, 0X2C83, 0X1CE0, 0X0CC1, 0XEF1F, 0XFF3E, 0XCF5D, 0XDF7C, 0XAF9B, 0XBFBA, 0X8FD9, 0X9FF8, 0X6E17, 0X7E36, 0X4E55, 0X5E74, 0X2E93, 0X3EB2, 0X0ED1, 0X1EF0 }; 
unsigned int Bytecal_crc(unsigned char *ptr, unsigned char len)
{
	unsigned int crc; 
	unsigned char da;
	crc=0; 
	while(len--!=0)
	{ 
		da=(uchar) (crc/256);				/* 以8 位二进制数的形式暂存CRC 的高8 位 */ 
		crc<<=8;							/* 左移8 位,相当于CRC 的低8 位乘以8 */
		crc^=crc_tab[da^*ptr];				/* 高8 位和当前字节相加后再查表求CRC ,再加上以前的CRC */
		ptr++;
	}
	return(crc);
}


// CRC 检验程序
unsigned char IsCrc16(const uchar *pData,int len) 
{
	unsigned int fcs; 
	fcs=0xffff;
	while ( len > 0 ) 
	{		
		fcs = (fcs << 8)^ crc_tab[fcs^ (*pData)&0xff];
		len--;
		pData++;
	}
	return(!fcs);
}

// CRC 校验的应用

static unsigned short crc; //16bit 
unsigned char CRC16(unsigned char ser_data) 

{ 
	// Update the CRC for transmitted and received data using // the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1). crc = (unsigned char)(crc >> 8) | (crc << 8);
	crc ^= ser_data; 
	crc ^= (unsigned char)(crc & 0xff) >> 4;
	crc ^= (crc << 8) << 4; 
	crc ^= ((crc & 0xff) << 4) << 1; 
	return 0; 
}

unsigned short doCRC16( unsigned char *mstr,unsigned char len) 
{ 
	unsigned char ch; 
	crc = 0; 
	do{ 
		ch = *mstr++; 
		CRC16(ch);
	}while(--len); 
	return(crc);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -