📄 crc.txt
字号:
以前刚好写过一段时间,拿出来给你吧!(多项式可能不同,自己动下脑筋改下吧!)
//-----------------------------------------------------------------
// 计算16位CRC函数之一
//-----------------------------------------------------------------
BYTE auchCRCHi[]=
{// CRC值的高字节列表
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
};
BYTE auchCRCLo[] =
{// CRC值的低字节列表
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};
BYTE CRC16Hi( BYTE * puchMsg, short usDataLen)// 得到CRC的高字节
{
BYTEuchCRCHi=0xFF;
BYTEuchCRCLo=0xFF;
BYTEuIndex;
while ( usDataLen-- )
{
uIndex = uchCRCHi ^ * puchMsg++;
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}
return ( uchCRCHi );
}
BYTE CRC16Lo( BYTE * puchMsg, short usDataLen)// 得到CRC的低字节
{
BYTEuchCRCHi=0xFF;
BYTEuchCRCLo=0xFF;
BYTEuIndex;
while ( usDataLen-- )
{
uIndex = uchCRCHi ^ * puchMsg++;
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}
return ( uchCRCLo );
}
//-----------------------------------------------------------------
// 计算16位CRC函数之二
//-----------------------------------------------------------------
unsigned int CRC(unsigned char *puchMsg, int count)
{
unsigned int CRC=0x0000;
unsigned char bit;
int i;
unsigned char * cp;
unsigned char Reverse8(unsigned char ch8);
unsigned int Reverse16(unsigned int ch16);
for( i=0;i<count;i++ )
{
puchMsg[i] = Reverse8(puchMsg[i]);
}
puchMsg[count] = 0x00; //在末尾添加16个0
puchMsg[count+1] = 0x00;
cp = puchMsg;
CRC = (*cp<<8)|*(cp+1);
cp =cp+2;
bit = (CRC>>15) & 0x0001; //记录最高位
CRC = (CRC<<1)|(*cp>>7);
while (count--)
{
for (i=0;i<8;i++)
{
if (bit != 0)
CRC = CRC^0xA001; //生成多项式为18005
bit = (CRC>>15)&0x0001;
if (i==7)
{
cp++;
CRC = (CRC<<1)|(*cp>>7);
}
else
CRC = (CRC<<1)|((*cp&(char)pow(2,6-i))>>(6-i)); //pow()为求方函数
}
i = 0;
}
CRC = (CRC>>1)|(bit<<15);
CRC = Reverse16(CRC);
return CRC;
}
unsigned char Reverse8(unsigned char ch8)//把一个8位的二进制数反序转换
{
unsigned char ch,b0,b1,b2,b3,b4,b5,b6,b7;
b7 = (ch8&0x01) << 7;
b6 = (ch8&0x02) << 5;
b5 = (ch8&0x04) << 3;
b4 = (ch8&0x08) << 1;
b3 = (ch8&0x10) >> 1;
b2 = (ch8&0x20) >> 3;
b1 = (ch8&0x40) >> 5;
b0 = (ch8&0x80) >> 7;
ch = b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7;
return ch;
}
unsigned int Reverse16(unsigned int ch16)//把一个16位的二进制数反序转换
{
unsigned int TempLo,TempHi,ch;
unsigned char Reverse8(unsigned char ch8);
TempLo = ch16 & 0x00ff;
TempHi = ch16 & 0xff00;
ch = (Reverse8(TempLo)<<8)|Reverse8(TempHi>>8);
return ch;
}
//-----------------------------------------------------------------
// 计算8位CRC的函数
//-----------------------------------------------------------------
unsigned char CRC(unsigned char *puchMsg, int count)
{
unsigned char CRC=0x00;
unsigned char bit;
int i;
unsigned char * cp;
puchMsg[count] = 0x00; //在末尾添加8个0
cp = puchMsg;
CRC = *cp;
cp =cp+1;
bit = (CRC>>7) & 0x01; //记录最高位
CRC = (CRC<<1)|(*cp>>7);
while (count--)
{
for (i=0;i<8;i++)
{
if (bit != 0)
CRC = CRC^0x07; //生成多项式为107H
bit = (CRC>>7)&0x01;
if (i==7)
{
cp++;
CRC = (CRC<<1)|(*cp>>7);
}
else
CRC = (CRC<<1)|((*cp&(char)pow(2,6-i))>>(6-i)); //pow()为求方函数
}
i = 0;
}
CRC = ((CRC>>1)|(bit<<7))^0xff; //陪集码为0xff
return CRC;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -