基于CAPL版本的CRC32算法

news2024/9/22 15:33:46
  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对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.coloradmin.cn/o/594037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UI设计用什么软件做?

1、即时设计 即时设计是一款国内的在线协同设计工具&#xff0c;提供原型设计、UI/UX 设计和设计交付等核心功能。它无需第三方插件&#xff0c;拥有丰富的组件样式、中英文字体库和本地化资源&#xff0c;受到专业设计师的好评。与其他国外的 UI 工具相比&#xff0c;即时设计…

加拿大访问学者博士后签证材料清单指南

加拿大作为一个受欢迎的留学和研究目的地&#xff0c;吸引着许多国际学者和博士后前往交流和深造。作为准备申请加拿大访问学者或博士后签证的申请人&#xff0c;准备充分的材料是至关重要的。下面是知识人网小编整理的个关于加拿大访问学者博士后签证材料清单的指南&#xff0…

mysql-xtrabackup的使用

一、安装 1.下载压缩包 根据当前地址选择对应的版本和系统 wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/tarball/percona-xtrabackup-2.4.28-Linux-x86_64.glibc2.17.tar.gz2.解压缩 tar xvf percona-xtrabac…

【分布鲁棒和多目标非负矩阵分解】基于DR-NMF的对NMF问题噪声模型的识别鲁棒性研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

A*寻路之旅:用SDL图形化演示

前言 欢迎来到小K的数据结构专栏的第十小节&#xff0c;本节将为大家带来A*寻路算法的图形化详解&#xff0c;学了之后寻路不再迷路&#xff08;✨当然也为大家准备了完整的源码&#xff0c;好像在文章顶部欸~ &#xff09;~希望你看完之后&#xff0c;能对你有所帮助&#xff…

ctfshow 每周大挑战 RCE极限挑战4、5

看过官方wp之后复现的&#xff0c;用的payload是自己后来写的&#xff0c;可能不如官方的看着清晰 有点强迫症似的在抠细节&#xff08;x 目录 挑战4最初的思路通过HackBar拿flag的写法写法一写法二 挑战5burp中的payload 大佬们也太极限啦 挑战4 最初的思路 第4题的长度限制…

UM2082F08 125k三通道低频无线唤醒ASK接收功能的SOC芯片 汽车PKE钥匙

1产品描述 UM2082F08是基于单周期8051内核的超低功耗8位、具有三通道低频无线唤醒ASK接收功能的SOC芯片。芯片可检测30KHz~300KHz范围的LF (低频)载波频率数据并触发唤醒信号&#xff0c;同时可以调节接收灵敏度&#xff0c;确保在各种应用环境下实现可靠唤醒&#xff0c;其拥…

母婴健康老人护理医护上门陪诊产后恢复预约上门小程序源码

母婴健康老人护理医护上门陪诊产后恢复预约上门小程序 在线预约 上门打针 产后恢复 会员卡 余额充值 优惠券 分销商 unippthinkphp <template> <view class"container" :style"{background:pagebase.base.bc}"> <Pengp…

Django+Vue实现文件上传下载功能

目录 前言 上传功能 后端代码 前端代码 下载功能 后端代码 前端代码 前言 首先我要实现的页面效果是这样的 当点击上传文件按钮&#xff0c;弹出上传文件的弹出框&#xff0c;可以上传多个文件&#xff0c;点击确定后才正式开始上传 点击右侧下载按钮&#xff0c;可以直…

springboot中将logback切换为log4j2

前言 springboot默认使用logback作为日志记录框架&#xff0c;常见的日志记录框架有log4j、logback、log4j2。这篇文章我们来学习怎样将logbak替换为log4j2。 一、为什么使用log4j2&#xff1f; 我们在项目中经常使用一个叫SLF4J的依赖&#xff0c;它是做什么的呢&#xff1f; …

Java 实现在顺序表末尾插入一个元素

一、思路 1.因为我们是用数组实现的顺序表&#xff0c;因此首先要保证数组有足够的空间来进行插入元素. 2.如果数组满了就需要将数组扩容&#xff0c;没满就开始插入. 3.当前数组中的元素个数就是每一次要插入的末尾位置的下标. 4.定义一个 usedSize 来表示当前的元素个数. 5.插…

Pandas+ChatGPT强强结合诞生PandasAI,数据分析师行业要变天了?

大家好&#xff0c;我是千与千寻&#xff0c;可以叫我千寻&#xff0c;我自己主要的编程语言是Python和Java。 说到Python编程语言&#xff0c;使用Python语言主要使用的是数据科学领域的从业者。 Python编程语言之所以在数据科学领域十分火热&#xff0c;源于Python语言的三…

9.Ansible Conditions介绍

Ansible条件语句 1)上面的例子在不同的机器上安装nginx&#xff0c;不同的操作系统风格使用不同的软件包管理器&#xff61;debian使用APT, Red Hat使用Yum, 但这是两个独立的Playbook,您必须为各自的服务器使用正确的剧本&#xff61; 可以使用条件语句&#xff0c;将这两个P…

Mongodb在Linux下载安装及部署

前言 一、下载安装包 Mongodb官网&#xff1a;Download MongoDB Community Server | MongoDB 二、安装及配置 博主下载的安装包是&#xff1a;mongodb-linux-x86_64-rhel70-6.0.6.tgz 新建目录 # 进入 usr 文件夹 cd /usr# 新建 mongodb 文件夹 mkdir mongodb# 进入 mongodb …

如何自学成为黑客

学习路线 不BB&#xff0c;直接上干货。 学完下面的内容&#xff0c;绝对可以进入黑客圈。 文末有福利噢&#xff01; 第一步&#xff1a;计算机基础 了解计算机基本常识&#xff0c;常用软件使用。需要学会基本使用的软件或技术有&#xff1a;Word、VMware、VPN、Visual St…

快速实现工程化部署,亚马逊云科技为AIGC产品化提供可靠基础

本文将以Stable Diffusion Quick Kit在亚马逊云科技Amazon SageMaker上的部署来介绍Stable Diffusion模型基础知识&#xff0c;HuggingFace Diffusers接口&#xff0c;以及如何使用Quick Kit在SageMaker Endpoint上快速部署推理服务。 Stable Diffusion模型 2022年由Stability…

自己拍摄的视频剪辑时如何消音?

由于录制环境的影响&#xff0c;有时制作出来的视频原始声音可能无法达到令人满意的效果&#xff0c;可能有噪声存在。这个时候&#xff0c;就应该先消除视频原始声音&#xff0c;然后后期再去给视频添加配音。有哪些适合给自己拍摄的视频调为静音的方法&#xff0c;来看看有哪…

详解 Windows 10 安装 CUDA 和 CUDNN

目录 查看本机 Window 10 系统已经安装 NIVIDIA 的驱动版本说在前面查看驱动版本 CUDA下载直接下载最新的 CUDA下载历史版本的 CUDA 安装测试 CUDNN下载 下载最新版本的 cuDNN下载历史版本的 cuDNN, 如: cuDNN 12.0安装 关于添加系统环境变量的问题 ⭐️⭐️说在前面!!! 建议 先…

平均年薪20W,自动化测试工程师这么吃香?

自动化测试工程师&#xff0c;平均年薪20w绝对不是空穴来凤&#xff0c;甚至我还说少了&#xff0c;加上年终奖和奖金等等年薪可能还不止20w这个水平&#xff0c;让我们看看下方截图&#xff0c;【来自于职友集】 本篇文章将由以下4个部分来展开&#xff1a; 1. 什么是自动化测…

PaddleClas初体验

PaddleClas初体验 该包是由百度PaddlePaddle组织下开源的项目&#xff0c;主要用于图像分类&#xff0c;图像搜索等相关任务。 项目地址&#xff1a; https://github.com/PaddlePaddle/PaddleClashttps://pypi.org/project/paddleclas 主要构件&#xff1a; PP-ShiTu&…