当前位置: 首页 > article >正文

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;

http://www.kler.cn/a/573615.html

相关文章:

  • DApp开发从入门到精通:以太坊/Solana公链生态实战解析
  • 【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)
  • Scala 中的数据类型
  • Docker--Docker 镜像制作
  • HTML第三节
  • AI-Deepseek + PPT
  • RAG检索增强生成(Retrieval-Augmented Generation)介绍(双模态架构:检索子系统、生成子系统)实现知识获取与内容生成的协同
  • C#使用SFTP批量上传和下载一个目录下的所有文件
  • Linux下启动redis
  • 8.RabbitMQ队列详解
  • java数据结构_再谈String_10
  • 15Metasploit框架介绍
  • 如何同步this.goodAllData里面的每一项给到row
  • 【Flink银行反欺诈系统设计方案】4.Flink CEP 规则表刷新方式
  • 图像伽马矫正 + 亮度调整 + 对比度调整
  • Redis面试常见问题——集群方案
  • Hi3516CV610电瓶车检测 电动自行车检测 人脸检测 人形检测 车辆检测 宠物检测 包裹检测 源码
  • Win10 用户、组与内置安全主体概念详解
  • Android中的触摸事件是如何传递和处理的
  • MySQL零基础教程16—表连接进阶