CRC算法(C语言)

发布于:2025-03-09 ⋅ 阅读:(114) ⋅ 点赞:(0)

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;

网站公告

今日签到

点亮在社区的每一天
去签到