CRC算法(C语言)
1、CRC8_SAE_J1850_ZERO (E2Ep01A)
- 初始 INITCRC:0x00
- 最终异或值 CRCOUT:0x00
- 多项式 Poly:x^ 8 + x^ 4 + x^ 3 + x^2 + 1
- 多项式转二进制:上面的x的几次方,就是在第几位上为1
- 二进制:100011101
- 由于我们是CRC8,只有八位,所以舍弃最高位,最后得到的Poly为:00011101
- 为了方便书写,我们将二进制转16进制,即 Poly= 0x1D
- 输入是否反转:否
- 结果是否反转:否
uint8_t CalculateCRC8(uint8_t * u8_data, uint8_t u8_len)
{
uint8_t i, j;
uint8_t crc8;
uint8_t poly;
crc8 = 0x00;
poly = 0x1D;
for (i = 0; i < u8_len; i++)
{
crc8 ^= u8_data[i];
for (j = 0; j < 8; j++)
{
if (crc8 & 0x80)
{
crc8 = (crc8 << 1) ^ poly;
}
else
{
crc8 <<= 1;
}
}
}
return crc8;
}
2、CRC8 普通版
MT上位机相关使用的CRC。
init需要传入0XFF。
uint8_t CRC8_0x07(uint8_t *ptr,uint16_t len,uint8_t init)
{
uint8_t crc;
uint8_t i;
crc = init;
while(len--)
{
crc ^= *ptr++;
for(i = 0;i < 8;i++)
{
if(crc & 0x80)
{
crc = (crc << 1) ^ 0x07;
}
else crc <<= 1;
}
}
return crc;
}
- 初始 INITCRC:0xFFFF
- 最终异或值 CRCOUT:0x00
- 多项式 Poly:x^ 16 + x^ 12 + x^ 5 + 1
- 输入是否反转:否
- 结果是否反转:否
3、CRC16/CCITT-FALSE (E2E profile5)
/****************************Info**********************************************
* Name: CRC-16/CCITT-FALSE x16+x12+x5+1
* Width: 16
* Poly: 0x1021
* Init: 0xFFFF
* Refin: False
* Refout: False
* Xorout: 0x0000
* Note:
*****************************************************************************/
uint16_t CRC16_CCITT_FALSE(uint8_t *data, uint16_t datalen)
{
uint16_t crc = 0xFFFF;
uint16_t Poly = 0x1021;
while (datalen--)
{
crc ^= *(data++) << 8;
for(int i = 0;i < 8;i++)
{
if(crc& 0x8000)
crc= (crc<< 1) ^ Poly ;
else
crc= crc<< 1;
}
}
return crc;