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

📄 cal_crc.c

📁 CRC-16算法的C语言实现(以常见的CRC-ITU为例引出的比特型算法)。
💻 C
字号:
//    a = sizeof(int);		a = 4
//	  a = sizeof(short);    a = 2
//	  a = sizeof(char);     a = 1

//16 bit CRC 校验码生成程序(计算法)
//G是生成多项式(bit16始终为1,G代表bit0~bit15)
//生成CRC:先在data[]数组装入数据,然后调用函数cal_crc16,生成2字节CRC码CRC_DATA,
//把CRC_DATA & 0xFF , CRC_DATA >> 8 装入data[]数组最后,调用函数cal_crc16,应生成的CRC余式为0

#include "stdio.h"
unsigned short cal_crc16(unsigned short general ,char *pdata,int datalen);
unsigned char data[ ] = {0xFF, 0x03, 0xC0, 0x21, 0x04, 0x03, 0x00, 0x07, 0x0D, 0x03, 0x06, 
						 0x03, 0xC0, 0x21, 0x04, 0x03, 0x00, 0x07, 0x07, 0x0D, 0x03, 0x06,0x66,0x4f};
int main(void)
{
//0x1021=CRC-ITU
	unsigned short G = 0x1021;
	unsigned short result;
    result = cal_crc16(G,data,sizeof(data));
	printf("result = %d = 0x%x \n\n",result,result);
	return 0;
}

unsigned short general_chg(unsigned short general)
//生成运算时需要的生成多项式掩码
{
	unsigned short new_g,i,j;
	new_g = 0;
	for(i = 0;i <= 15;i ++)
	{
		j = (general >> i) & 0x01;
		new_g = new_g | (j << (15-i));
	}
	printf("G = 0x%x , G_mask = 0x%x \n",general,new_g);
	return new_g;
}

unsigned short cal_crc16(unsigned short general ,char *pdata,int datalen)
{
	unsigned short reg16;
	unsigned short general_mask;			//运算时的掩码
	int i,j,byte_temp,bit_temp;
	reg16 = 0xffff;							//reg赋初值
	general_mask = general_chg(general);
	for(i = 0;i < datalen;i++)
	{
		byte_temp = *(pdata + i);
		for(j = 0;j <= 7;j++)
		{
			bit_temp = ((byte_temp >> j) & 0x01) ^ (reg16 & 0x01);
			reg16 = reg16 >> 1;
			if(bit_temp == 1)
			{
				reg16 = reg16 ^ general_mask;
			}
		}
	}
	return reg16;
}

⌨️ 快捷键说明

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