📄 cal_crc.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 + -