基于CAPL版本的CRC32算法

news/2024/11/24 2:19:38/
  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
  • 🍅 玩转CANoe,博客目录大全,点击跳转👉

📙CRC在线计算平台

  • 记录下,在做CRC32校验算法中遇到的问题,以及解决方法,还有一些可参考的文档

  • 首先我们要有一个标准的CRC校验算法的参考标准,来验证我们算的对不对,简单,免费,好用的一个在线计算平台http://www.ip33.com/crc.html

  • 我现在想验证 byte test[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88}; 在下面条件下的CRC32结果
    1,多项式:0x04C11DB7
    2,输入初始值:0xFFFFFFFF
    3,输入反转:TRUE
    4, 输出反转:TRUE
    5,输出异或:0xFFFFFFFF

CRC32算法的原理,这些参数,网上资料很多,不在此讲解

在这里插入图片描述

📙参考代码

  • 网上也有很多CRC32代码 的参考文章,良莠不齐,我觉得 这个文章挺不错的,基于C语言版本的。https://zhuanlan.zhihu.com/p/385185293
  • 我列出了部分代码,重点在于基于这个代码,发现它的输入反转这点代码有问题crc ^= ReflectedData(*buffer++, REF_8BIT) << 24;,无法得到正确的CRC值,输出反转没问题。
uint32_t ReflectedData(uint32_t data, REFLECTED_MODE mode)
{data = ((data & 0xffff0000) >> 16) | ((data & 0x0000ffff) << 16);data = ((data & 0xff00ff00) >> 8) | ((data & 0x00ff00ff) << 8);data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4);data = ((data & 0xcccccccc) >> 2) | ((data & 0x33333333) << 2);data = ((data & 0xaaaaaaaa) >> 1) | ((data & 0x55555555) << 1);switch (mode){case REF_32BIT:return data;case REF_16BIT:return (data >> 16) & 0xffff;case REF_8BIT:return (data >> 24) & 0xff;case REF_7BIT:return (data >> 25) & 0x7f;case REF_6BIT:return (data >> 26) & 0x7f;case REF_5BIT:return (data >> 27) & 0x1f;case REF_4BIT:return (data >> 28) & 0x0f;}return 0;
}uint32_t CheckCrc32(uint32_t poly, uint32_t init, bool refIn, bool refOut, uint32_t xorOut,const uint8_t *buffer, uint32_t length)
{uint32_t i = 0;uint32_t crc = init;while (length--){if (refIn == true){crc ^= ReflectedData(*buffer++, REF_8BIT) << 24;}else{crc ^= (*buffer++) << 24;}for (i = 0; i < 8; i++){if (crc & 0x80000000){crc <<= 1;crc ^= poly;}else{crc <<= 1;}}}if (refOut == true){crc = ReflectedData(crc, REF_32BIT);}return crc ^ xorOut;
}

📙 字节按位反转算法

  • 上面定位了是输入按位反转代码出现了,我们就要去了解什么是按位反转,怎么写这个算法,参考如下https://www.cnblogs.com/Imageshop/p/12116382.html

在这里插入图片描述

📙 CAPL 形式的CRC32算法


on prestart
{byte test[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};write("crc32 1 : 0x%x",crc32(test,8));//}byte Reverse8U(byte x)
{x = (x & 0xaa) >> 1 | (x & 0x55) << 1;x = (x & 0xcc) >> 2 | (x & 0x33) << 2;x = (x & 0xf0) >> 4 | (x & 0x0f) << 4;return x;
}dword Reverse32U(dword data )
{ data = ((data & 0xaaaaaaaa) >> 1) | ((data & 0x55555555) << 1);data = ((data & 0xcccccccc) >> 2) | ((data & 0x33333333) << 2);data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4);data = ((data & 0xff00ff00) >> 8) | ((data & 0x00ff00ff) << 8);data = ((data & 0xffff0000) >> 16) | ((data & 0x0000ffff) << 16);return data;
}dword crc32(byte data[],long length)
{long i ,j;dword crc32;crc32 = 0xFFFFFFFF;for (i = 0;i < length;i++){data[i] =  Reverse8U(data[i]);crc32 = crc32 ^(data[i]<<24);for (j = 0;j < 8;j++){if (crc32 & 0x80000000)crc32 = (crc32  << 1) ^ 0x04C11DB7; else crc32 = crc32 << 1;}}crc32 = Reverse32U(crc32);//输出反转crc32 = crc32 ^ 0xFFFFFFFF; //输出异或return crc32;
}

在这里插入图片描述

🌎总结

23

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18

http://www.ppmy.cn/news/124940.html

相关文章

如果你很焦虑、浮躁,不如去读一读林曦这本《无用之美》

生活中不可或缺的是柴米油盐&#xff0c;而濡养人心的往往是无用之美。——林曦    很难用语言写出这本书的美。有些书会给你带来内心的激荡&#xff0c;有些会让你充满力量&#xff0c;而林曦老师的书便自带一种轻盈的美&#xff0c;越往下读越能让人凝神静气。      …

ElasticSearch dense_vector向量写入-Java实现

文章目录 1. 介绍2. ElasticSearch 索引设计3. 索引单个文档4. 批量索引文档 1. 介绍 本文介绍了如何使用Java High level API 完成dense_vector类型向量的写入&#xff0c;内容包含了单个文档的索引和批量文档的索引。 2. ElasticSearch 索引设计 PUT caster_vector1 {&quo…

自定义kong插件golang版本

开发一个go版本的kong 插件&#xff0c;通常需要以下3个步&#xff1a; 基于kong提供的go语言版本的PDK编写并且编译kong插件 --》 在kong的kong.conf文件中配置插件位置 --> 通过kong的admin api来启用插件 一、使用go语言编写kong插件 1、定义Config对象 type Config s…

适合计算机系用的笔记本,七款适合设计师的最好的笔记本电脑推荐!

平面设计需要什么样的计算机规格&#xff1f; 在购买笔记本电脑时&#xff0c;特别是高端型号&#xff0c;大量的规格和功能可能会有点压倒型。这是一个快速的行话破坏者&#xff0c;可以帮助您像专业人士一样选择&#xff1a; 处理器 由于您可能正在使用耗电的程序进行创造型工…

如何查找计算机的品牌型号,笔记本怎么看型号 各品牌笔记本型号查看方法

在查看笔记本配置、查找硬件驱动的时候&#xff0c;经常需要通过笔记本具体型号去网上或者官网查询。那么&#xff0c;笔记本怎么看型号&#xff1f;如果是新电脑&#xff0c;在笔记本发票或者包装盒上就可以查看到&#xff0c;但是笔记本用久了&#xff0c;发票/包装盒不知道飞…

怎么查看笔记本内存条型号_笔记本如何加内存条之如何查看笔记本内存品牌和型号...

笔记本如何加内存条之如何查看笔记本内存品牌和型号 看到邻居小朋友的华硕笔记本安装了64位Win7旗舰版系统&#xff0c;只有2G内存&#xff0c;开机特别卡!小朋友问解决的办法&#xff0c;就是加条内存条呗!相信很多朋友有这方面的考虑!因为经常看到有朋友在网上提问&#xff0…

联想笔记本安装什么系统好?

联想笔记本是很多上班族和学生党首选的笔记本品牌&#xff0c;用户购买电脑之后可能会想安装自己常用的Windows系统。那联想笔记本装什么系统比较好用呢&#xff1f;小编觉得最新、受众最多的系统并不代表就是最好用的&#xff0c;适合自己电脑配置的系统才是最好的。下面就来看…

笔记本电脑测试性能哪个软件好,新笔记本测试如何进行 旧笔记本测试性能【图文】...

信息化时代的到来不仅提供了娱乐&#xff0c;丰富了人们的生活&#xff0c;也提供了快捷信息通道&#xff0c;帮助人们工作。所以有一大部分人都拥有多台电脑&#xff0c;尤其是 笔记本电脑 &#xff0c;它功能齐全&#xff0c;体积较小&#xff0c;配件也不多&#xff0c;所以…