【CANoe】文件处理_hex文件读取解析

news2024/11/6 21:28:43

hex文件里面只有00,01,04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。

hex文件格式的解析,可阅读:HEX文件格式详解

首先创建一个Block的结构体,根据经验我们知道,一个数据块有:开始的地址,数据的长度,以及数据Buffer。三个结果。而一个hex文件里面可能有多个数据块,因此我们接下来声明了5个数据块。这个需要根据变量进行调整。然后根据hex文件初始化数据块的个数。再声明变量 HexBlockTotalNumber 为数据块的总数。

/*@!Encoding:936*/
variables
{
  struct Block {
  dword   BlockStartAddr;       //数据开始的地址
  dword BlockDataLength;        //数据的长度
  byte dataBuffer[0x020FFFF];   //数据区域(单块数据的Buffer,如果hex文件很大,则需要把参数调大)
  };  
  struct Block hexfile[5];      //创建5个数据块(主要根据HEX文件进行调整,hex有几个数据块就需要设置几个)
  int HexBlockTotalNumber = 0;  //数据块总数
  dword t1;                     //计算解析所用的时间
}
 
 
/*********************************************************************************
  *Function:  //char2byte
  * Description:  //把单个字符转换为Byte的函数
  *Input:  //ch:ASCII编码字符,取值为0到F
  *Return:  //val,为byte类型
**********************************************************************************/
byte char2byte(char ch)
{
   byte  val;
   val = 0;
   if ( ch >= '0' && ch <= '9')
   {
      val = ch - '0';      
   }
   if ( ch >= 'a' && ch <= 'f')
   {
      val = (ch - 'a') + 10;      
   }
   if ( ch >= 'A' && ch <= 'F')
   {
      val = (ch - 'A') + 10;       
   }
   return val;
}
 
/*********************************************************************************
  *Function:  //Read_hexFile
  * Description:  //解码HEX文件,只支持0x00,0x04,0x01类型
  *Input:  //Filename:需要解码的文件名
  *Output:  //hexfile
  *Return:  //void
**********************************************************************************/
//读取HEXFILE
void Read_hexFile(char Filename[])
{
  
  long file_handle;
  char RowData[128];                        //逐行读取,每行数据缓存,当每行数据大于128时,需要将其调整
	dword   i;
	dword   RowDataByte;											//单块数据块字节数
	qword   OffsetAddress;										//扩展线性地址 	
	qword   ReAddr;												//上一数据行起始地址 
	dword   Len;													//HEX每行有效数据字节数
	dword   ReLen;												//HEX前一次数据长度
	dword   Addr;													  //HEX每行起始地址
	dword    Type;		                    //HEX每行类型,有00,01,04四种类型
  RowDataByte = 0;i = 0;Len = 0;ReLen = 0;Addr=0;Type = 0;ReAddr = 0;
  file_handle = OpenFileRead(Filename,0);
  HexBlockTotalNumber = 0;
  if(file_handle!=0)
  { // Read all lines
    while ( fileGetStringSZ(RowData,elcount(RowData),file_handle)!=0 ){
      //判断首字符是否为:号
      if(RowData[0] == ':'){
        Len = (char2byte(RowData[1])*0x10+char2byte(RowData[2]));
        Addr = char2byte(RowData[3])*0x1000+char2byte(RowData[4])*0x100+char2byte(RowData[5])*0x10+char2byte(RowData[6]);
        Addr |= (OffsetAddress << 16);
        Type = char2byte(RowData[7])*0x10+char2byte(RowData[8]);
        //以下为打印解析的过程,打印解析时候的变量
        //write("RowData:%s,HexBlockTotalNumber:%d,ReLen:%X,ReAddr:%X,Addr:%X,RowDataByte:%X",RowData,HexBlockTotalNumber,ReLen,ReAddr,Addr,RowDataByte);
        switch(Type){
          case 0x00:											  //数据
            if (Addr  > (ReLen + ReAddr)){  //判断为新数据块
                if(RowDataByte == 0)			  //是否为首行数据字节数
  							{ 
  								hexfile[HexBlockTotalNumber].BlockStartAddr = Addr;         //记录新数据块的起始地址
  							}
  							else										    //不是首行
  							{
  								hexfile[HexBlockTotalNumber].BlockDataLength = RowDataByte; //数据长度  
  								RowDataByte = 0;					//重新开始计数
                  HexBlockTotalNumber++; 
  								hexfile[HexBlockTotalNumber].BlockStartAddr = Addr;		      //记录新数据块的起始地址
  							}
            }
             for(i = 0; i< Len ; i++)
                {
                  //储存buffer,注意没有对crc进行校验。
                  hexfile[HexBlockTotalNumber].dataBuffer[RowDataByte++]=(char2byte(RowData[2*i+9])*0x10+char2byte(RowData[2*i+10]));
                }  
            ReAddr = Addr;									//保存当前地址,下一次使用  
						ReLen  = Len;									  //保存当前长度,下一次使用   
           break;
          case 0x04:										   	//扩展线性地址记录
						OffsetAddress =  char2byte(RowData[9])*0x1000+char2byte(RowData[10])*0x100+char2byte(RowData[11])*0x10+char2byte(RowData[12]);		//偏移地址	 
					break;
          case 0x01:										   	//地址,结束 
           hexfile[HexBlockTotalNumber].BlockDataLength = RowDataByte;        //数据长度
           HexBlockTotalNumber++;
          break;          
        }        
      }
 
    }
  write("Hex文件读取成功, 数据分块:%d",HexBlockTotalNumber);
  for(i = 0; i < HexBlockTotalNumber; i++)
		{
			write("数据块:%d,  起始地址:0x%X, 结束地址:0x%X, 数据长度:%6d字节\r\n", i+1, hexfile[i].BlockStartAddr, hexfile[i].BlockStartAddr + hexfile[i].BlockDataLength - 1, hexfile[i].BlockDataLength);
		}
  fileClose(file_handle);
  }
  else{
     write("OpenFileRead,error occurs");
  }
 
}
on key 'f'
{
  t1 = timeNow();
  Read_hexFile(".//test.hex");
  write("解析耗时:%f",t1-timeNow());
  write("数据块:1");
  write(0);
  write("数据块:2");
  write(1);
}
 
write (byte blockNum)
{
   int i;
   for (i=0; i<16; i++) write("dataBuffer[%d]:0x%2X",i,hexfile[blockNum].dataBuffer[i]);
}

text.hex用Hexview打开的结果,我们读取圈中部分的数据:
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述

参考:
CANOE CAPL编程 HEX文件读取
https://blog.csdn.net/zengqz123/article/details/106550213

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115111.html

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

相关文章

gRPC之gRPC转换HTTP

1、gRPC转换HTTP 我们通常把RPC用作内部通信&#xff0c;而使用Restful Api进行外部通信。为了避免写两套应用&#xff0c;我们使用grpc- gateway 把gRPC转成HTTP。服务接收到HTTP请求后&#xff0c;grpc-gateway把它转成gRPC进行处理&#xff0c;然后以JSON 形式返回数据。…

FOC程序算法编写

1、FOC多路PWM驱动 在BLDC电机控制上&#xff0c;6路PWM 控制模式比3路PWM更自由&#xff0c;因为6个半桥式晶体管的每一个都可以单独控制。 &#xff08;1&#xff09;3PWM &#xff08;2&#xff09;6PWM 2、死区时间 开关元器件的和严格意义并不是相同的。IGBT&#xff0c;…

驱动编写LED灯

demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include<linux/io.h> #include "head.h" unsigned int major; char kbuf[128] {}; // 定义三个指针指向映射后的虚拟…

vue3.0 + element plus upload文件上传

提供了&#xff0c;文件超过指定个数&#xff0c;页面做了隐藏的效果 记录一下

HTTPS、SSL/TLS,HTTPS运行过程,RSA加密算法,AES加密算法

1、为什么网站要使用安全证书 我们所处的网络环境是复杂多样的&#xff0c;大致分为两类&#xff0c;一类是可信的网络服务商&#xff0c;比如直接连的电信运营商的网络&#xff0c;网线&#xff0c;4G&#xff0c;5G&#xff1b;另一类是不可信的网络&#xff0c;比如WIFI&am…

libpcap之零拷贝mmap

一、用户空间 在通过socket(AF_PACKET,…)创建fd后&#xff0c;进行接收队列的建立 //pcap-linux.c static int pcap_activate_linux(pcap_t *handle) { ...ret setup_mmapped(handle, &status); ... }1.1 设置默认ring bufer size static int setup_mmapped(pcap_t *h…

点云处理【六】(点云分割)

点云分割 第一章 点云数据采集 1. 点云分割 点云数据中包含目标物体&#xff0c;点云分割算法即将物体分割出来。 2 分割算法 2.1 RANSAC(随机采样一致性)方法 基于随机采样一致性的分割的步骤如下&#xff1a; 1.从一个样本集S中&#xff0c;随机抽取n个样本&#xff0c;…

下拉选择框监听el-option的方式

<el-select v-model"form.expenseType" placeholder"请选择费用类型" clearable filterable size"small"><el-option v-for"item in expenseNameList" :key"item.value" :label"item.label" :value"…

发现学习的新契机——广东开放大学电大搜题服务

广东开放大学一直以来致力于为广大学子提供优质的教育资源和学习支持&#xff0c;而最新推出的电大搜题微信公众号更进一步满足了学生们对于学习资料的需求。这一全新的学习辅助工具将为学子们带来便捷、高效的学习体验。 无论是传统的广播电视大学学生&#xff0c;还是广东开…

首届中国虚拟艺术巡展 NFT Showcase 圆满落幕!

由 Web3 营销先锋 Beep Crypto 精心策划&#xff0c;于 10 月 5 日至 10 月 17 日在广州潮流策展空间 YCC! 天宜隆重呈现。 本届展览以“虚拟时尚”为主题&#xff0c;融汇了众多的数字艺术展品&#xff0c;包括诸如 RTFKT X Nike、Gucci X 10KTF、Tiffany X Cryptopunks、Mee…

python二次开发Solidworks:读取立方体的高度

在SW中新建一个零件文档&#xff0c;建立一个立方体&#xff0c;长度和宽度自定义&#xff0c;高度100mm&#xff0c;下面通过python实现读取该立方体的高度&#xff1a; import win32com.client as win32 import pythoncomswApp win32.Dispatch(sldworks.application) swApp.…

使用telegram机器人发送通知

文章目录 背景1 创建机器人2 与机器人的会话3 调用API让机器人发送消息 背景 在训练深度学习模型时&#xff0c;除了粗略估计外&#xff0c;很难预测训练何时结束。此外&#xff0c;我们可能还想随时随地查看训练情况&#xff0c;如果每次都需要登录回服务器的话并不方便。因此…

RK3568笔记四:基于TensorFlow花卉图像分类部署

若该文为原创文章&#xff0c;转载请注明原文出处。 基于正点原子的ATK-DLRK3568部署测试。 花卉图像分类任务&#xff0c;使用使用 tf.keras.Sequential 模型&#xff0c;简单构建模型&#xff0c;然后转换成 RKNN 模型部署到ATK-DLRK3568板子上。 在 PC 使用 Windows 系统…

项目环境配置

一、后端环境搭建-前后端联调 1.1 nginx反向代理 1.2 nginx负载均衡配置 二、完善登录功能 处理密码明文&#xff0c;防止密码被别人获取破坏系统 MD5加密是单向的不可逆的 &#xff0c;不能由加密后的换算加密前的 //密码比对password DigestUtils.md5DigestAsHex ( pa…

二叉树,堆排序及TopK问题

要讲二叉树的概念&#xff0c;就要先讲树的概念。 树是什么呢&#xff1f; 树其实是一种储存数据的结构&#xff0c;因为他的结构倒过来和生活中的树很相似所以才被称之为树。 这是一颗多叉树&#xff0c;从最顶端的节点可以找到下边的几个节点&#xff0c;下边的节点又可以找…

Apollo:前端开发者的全栈探索之旅

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【C语言必知必会 | 第四篇】一文带你精通顺序结构

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第四篇&#xff0c;进行C语言顺序结构的专项练习&#xff0c;结合专题优质题目&#xff0c;带领读者从0开始&#xff0…

Halcon手眼标定

手眼标定&#xff08;参考&#xff1a;B站王佳琪老师) 这里说的手眼标定中的手指的是机械手或者电机运动的轴&#xff0c;眼表示摄像头 就是两个空间坐标系的转换&#xff0c;这个转换需要一个转换矩阵&#xff0c;那么转换矩阵需要根据两个坐标系的对应的九个点来通过vec_to…

如何用记事本制作一个简陋的小网页(3)——注册信息表

目录 前提须知&#xff1a; 一、表格建立之前&#xff1a; 二、表格的建立&#xff1a; 三、信息表的内容填充&#xff1a; 1.昵称 和 电话 &#xff1a; 2.密码&#xff1a; 3.性别&#xff1a; 4. 爱好&#xff1a; 5.民族&#xff1a; 6. 出生日期&#xff1a; 7.…