📄 crc.c
字号:
#include "crc.h"
#define POLYNOMIAL16 0x1021 //x^16+x^12+x^5+1
#define PRESET_VALUE16 0xFFFF
#define POLYNOMIAL5 0x09<<3 //x^5+x^3+1
#define PRESET_VALUE5 0x09<<3
/*
*str为需要crc编码的字符串;
byLen为整个字符串的长度;
rmd为字符串最后一个字节的有效位数长度
*/
unsigned int caculate_crc16(unsigned char *str,unsigned int byLen,unsigned int rmd)
{
unsigned int currCrcVlu;
unsigned int i,j;
currCrcVlu = PRESET_VALUE16;
for(i=0;i<byLen-1;i++)
{
currCrcVlu = currCrcVlu^(((unsigned int)str[i])<<8);
for(j=0;j<8;j++)
{
if(currCrcVlu & 0x8000)
currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL16;
else
currCrcVlu = (currCrcVlu<<1);
}
}
currCrcVlu = currCrcVlu^(((unsigned int)str[i])<<8);
for(j=0;j<rmd;j++)
{
if(currCrcVlu & 0x8000)
currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL16;
else
currCrcVlu = (currCrcVlu<<1);
}
return(~currCrcVlu);
}//test ok
unsigned char caculate_crc5(unsigned char *str)
{
unsigned char currCrcVlu;
unsigned int i,j;
currCrcVlu = PRESET_VALUE5;
for(i=0;i<4;i++)
{
if(i != 3)
{
currCrcVlu = currCrcVlu^(str[i]<<3);
for(j=0;j<5;j++)
{
if(currCrcVlu & 0x80)
currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL5;
else
currCrcVlu = (currCrcVlu<<1);
}
}
else
{
currCrcVlu = currCrcVlu^(str[i]<<6);
for(j=0;j<2;j++)
{
if(currCrcVlu & 0x80)
currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL5;
else
currCrcVlu = (currCrcVlu<<1);
}
}
}
currCrcVlu = (currCrcVlu>>3)&0x1f;
return(currCrcVlu);
} //test ok
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -