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

📄 crcgetcrc.c

📁 这是我项目中使用的CRC算法的源码
💻 C
字号:
/****************************************************************************************
*文件名:crcGetCrc.c								COPYRIGHT(C) JINYANLAI
*												All Rights Reserved
*说明:计算起始地址为ptr,长度为len的数组的CRC校验值。
=========================================================================================
*版本历史
=========================================================================================
*版本	*时间		*作者	*更改标记		*更改说明
*----	*----		*----	*-------		*--------
* 0.1	*20061116	*敬恒	*无				*无

****************************************************************************************/
#include "includes.h"

#if USE_CRC_CCITT >= 1
	#if USE_CRC_BITS >=1
	INT16U crcGetCrc(INT8U *ptr, INT16U len)
	{
		INT8U	i;
		INT16U	lu16CrcReg = 0x0;				//CRC寄存器
		while(len--)
		{
			for(i = 0x80; i != 0; i >>= 1)
	        {
				if(lu16CrcReg & 0x8000)		//CRC的bit15与输入的bit异或,
				{							//为真则左移一位,然后与0x1021异或。
					lu16CrcReg <<= 1;		//为假则直接移位。此处程序将if(bit15^bit)
					lu16CrcReg ^= 0x1021;	//分解为if(bit15)和if(bit)两条语句。
				}							//两次异或保持数据不变。
				else lu16CrcReg <<= 1;

				if(i & *ptr)				//if(bit)
				{
					lu16CrcReg ^= 0x1021;
				}
			}
			ptr++;
		}
		return(lu16CrcReg);
	}
	
	#else	//使用查表法
	
	INT16U crcGetCrc(INT8U *ptr, INT16U len)		//len的长度可以视情况增加为32位。
	{
		INT16U lu16CrcReg = 0x0;

		while(len--)
		{
			lu16CrcReg = (lu16CrcReg << 8) ^ gu16CrcTable[(INT8U)(lu16CrcReg >> 8) ^ *ptr++];
		}
		return(lu16CrcReg);
	}
	#endif
#elif USE_CRC_32 >=1
	#if USE_CRC_BITS >=1
	INT32U crcGetCrc(INT8U *ptr, INT32U len)
	{
		INT8U	i;
		INT32U	lu32CrcReg = 0x0;			//CRC寄存器
		while(len--)
		{
			for(i = 0x80; i != 0; i >>= 1)
	        {
				if(lu32CrcReg & 0x80000000)	//CRC的bit31与输入的bit异或,为真则左移一位,
				{								//然后与0x04C11DB7异或;为假则直接移位。
					lu32CrcReg <<= 1;			//此处程序将if(bit31^bit)分解为if(bit31)和
					lu32CrcReg ^= 0x04C11DB7;	//if(bit)两条语句。两次异或保持数据不变。
				}
				else lu32CrcReg <<= 1;

				if(i & *ptr)	//if(bit)
				{
					lu32CrcReg ^= 0x04C11DB7;
				}
			}
			ptr++;
		}
		return(lu32CrcReg);
	}
	
	#else
	INT32U crcGetCrc(INT8U *ptr, INT32U len)
	{
		INT32U lu32CrcReg=0x0;

		while(len--)
		{
			lu32CrcReg = (lu32CrcReg << 8) ^ gu32CrcTable[(INT8U)(lu32CrcReg >> 24) ^ *ptr++];
		}
		return(lu32CrcReg);
	}
	
	#endif
#endif

⌨️ 快捷键说明

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