工作经验总结:Hex文件解析

一、Hex文件简介

由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。一般用于MCU程序烧录,可以把hex文件理解为带有地址信息的bin数据的记录集合。(注:烧录时如果使用bin文件则需要指明对应首地址的位置,而使用hex文件则不需要,因为hex文件中包含了对应地址包含的数据内容)

二、Hex文件记录格式与解析

Hex文件记录格式:

RECORD MASK ":"RECLENLOAD OFFSETRECTYPEINFO OR DATACHKSUM
1 Byte1 Byte2 Byte1 Byten Byte1 Byte
  • RECORD MASK:HEX文件的起始格式,文件一开始应该是一个冒号作为起点
  • RECLEN:表示[INFO OR DATA]区域有多少字节的数据长度
  • LOAD OFFSET:表示数据偏移的地址(数据开始记录的偏移地址)
  • RECTYPE:表示该行的Hex文本的类型
    • 00 表示该行记录的是数据(可以理解为bin文件内容)
    • 01 表示该Hex文件结束,一般放在最末尾
    • 02 表示记录的是扩展段地址(数据地址段)
    • 03 表示记录的是开始段地址
    • 04 表示记录的是扩展线性地址
    • 05 表示记录的是起始线性地址(一般认为main函数入口地址)
  • INFO OR DATA:该行的数据或者地址信息
  • CHKSUM:该行的检验和 [该行所有16进制(除了checksum)的累加和S,然后(0x100 - S)& 0xFF]

注意:最常见的Recv type有00、01、04、05

(1)RECTYPE 00 数据标识

 04 2000 00 FECACEFA 4C

04 表示本行有4个字节数据

2000  表示偏移地址为0x2000

FECACEFA  表示本行数据

4C 为该行校验和计算如下:

  • 累加和S =(04 + 20 + 00 + FE + CA + CE + FA)= 0x3B4;
  • 校验和CHKSUM  = (0x100 - S)& 0xFF = 0x4C

(2)RECTYPE 01 文件结束标识

: 00 0000 01 FF

00 表示本行有0个字节数据

0000 表示偏移地址为 0x0000

01  表示Hex文件结束

FF 为该行校验和计算如下:

  • 累加和S =(00 + 00 + 00 + 01)= 0x01;
  • 校验和CHKSUM  = (0x100 - S)& 0xFF = 0xFF

(3)RECTYPE 02 扩展段标识

USBA:用于记录16位扩展段地址的段基址为位4—19(SBA),其中SBA的位0---3为0。位4—19称为上段基地址USBA,再加上LOAD OFFSET就可计算数据偏移量地址。

:02 0000 02 1200 EA  

02 表示本行有2个字节数据

0000 表示偏移地址为 0x0000

02 表示扩展段标识

1200 表示扩展段标识,对应的段地址为0x0001 2000

EA 为该行校验和计算如下:

  • 累加和S =(02 + 00 + 00 + 02 + 12 + 00)= 0x16;
  • 校验和CHKSUM  = (0x100 - S)& 0xFF = 0xEA

 (4)RECTYPE 03 开始段地址

(5)RECTYPE 04 扩展线性地址标识

: 02 0000 04 0005 F5

02 表示本行有2个字节数据

0000 表示偏移地址为 0x0000

04 表示为拓展线性地址

0005 表示扩展线性地址的高16位为0x0005低16位在LOAD OFFSET中为 0x0000,即在下一个04出现前,后续数据记录的基址为 0x0005 0000

F5 为该行校验和计算如下:

  • 累加和S =(02 + 00 + 00 + 04 + 00 + 05)= 0x0B;
  • 校验和CHKSUM  = (0x100 - S)& 0xFF = 0xF5

(6)RECTYPE 05 起始线性地址标识

04 0000 05 00000411 E2

04 表示本行有4个字节数据

0000 表示偏移地址为 0x0000

05 表示起始线性地址标识

00000411 表示目标执行起始地址为0x0000 0411可以在对应map文件中找到

E2 为该行校验和计算如下:

  • 累加和S =(04 + 00 + 00 + 05 + 00 + 00 + 04 + 11)= 0x1E;
  • 校验和CHKSUM  = (0x100 - S)& 0xFF = 0xE2

示例:

:040000050000841162

(7)Recv type 04/00/05/01 简单示例

:020000040005F5
:04200000FECACEFA4C
:0400000500000411E2
:00000001FF

: 02 0000 04 0005 F5 :该行表示后续数据记录的扩展线性地址的基址为 0005 0000

04 2000 00 FECACEFA 4C:表示 0x0005 2000地址起始的数据为FECACEFA

0x0005 20000xFE
0x0005 20010xCA
0x0005 20020xCE
0x0005 20030xFA

04 0000 05 00000411 E2:表示0x0000 0411为main函数的入口地址

: 00 0000 01 FF:表示Hex文件末尾

(8)Recv type 04/02/00 简单示例

:020000040108F1
:020000021200EA 
:0401000090FFAA556D 

:02 0000 04 0108 F1该行表示后续数据记录的扩展线性地址的基址为   0108 0000

:02 0000 02 1200 EA该行表示后续数据记录的扩展段地址的基址为 0001 2000                

:04 0100 00 90FFAA55 6D:该行表示0x0108 0000 +   0x0001 2000 + 0x0100 的起始地址数据为90FFAA55

实际物理地址=扩展线性地址 + 扩展段地址 + 数据偏移地址 = 0x0108 0000 +   0x0001 2000 + 0x0100 = 0x0109 2100

三、Hex文件解析Python代码示例

Hex文件的内容行解析python代码示例:

def _line_analyse(self, line:str):# string fliterline = line.strip()  # 去除开头与结尾的空格或换行符# Hex file formatrecord_mask    = line[0]data_len       = int(line[1:3], 16)load_offset    = int(line[3:7], 16)recv_type      = int(line[7:9], 16)checksum       = int(line[-2:], 16)# Hex file info string disposeDATA_START_INDEX = 9DATA_STR_LENGTH  = data_len * 2if (record_mask == ":") and (self.is_finished_analyse == False):# 数据记录类型if (recv_type == 0x00):     base_addr = self.address_info_list[-1]address = base_addr + load_offsetdata_hex_list = []for i in range(0, DATA_STR_LENGTH, 2):data_hex = int(line[DATA_START_INDEX + i : DATA_START_INDEX + i + 2], 16)data_hex_list.append(data_hex)# checksum 校验和检测# 该行所有16进制累加和S, 然后0x100 - Schecksum_temp = 0for i in range(1, len(line) - 2, 2):checksum_temp += int(line[i : i+2], 16)checksum_temp = (0x100 - checksum_temp) & 0xFF# 数据保存if checksum_temp == checksum:self.data_dict[address] = data_hex_listelse:print("checksum_temp:0x{:2x}, checksum:0x{:2x}, line:{:s}".format(checksum_temp, checksum, line))# 文件结束类型elif(recv_type == 0x01):    self.is_finished_analyse = True# 标识拓展段地址 (Hex86)elif(recv_type == 0x02):     pass# 标识开始段地址 (Hex86)elif(recv_type == 0x03):pass# 标识扩展线性地址elif(recv_type == 0x04):address_high_half_word = int(line[DATA_START_INDEX : DATA_START_INDEX + DATA_STR_LENGTH], 16)address_low_half_word = load_offsetaddress = ((address_high_half_word << 16) | (address_low_half_word)) & 0xFFFFFFFF# 补充地址信息self.address_info_list.append(address)# 标识开始线性地址 (main函数入口地址)elif(recv_type == 0x05):eip_address = int(line[DATA_START_INDEX : DATA_START_INDEX + DATA_STR_LENGTH], 16) + load_offsetself.main_address = eip_addresselse:pass

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

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

相关文章

最新2024FL Studio21.2.3中文免费版数字音乐工作站(DAW)

FL Studio 21作为一款功能强大的数字音乐工作站&#xff08;DAW&#xff09;&#xff0c;被广泛应用于各种音乐制作场景中。以下是一些具体的案例&#xff1a; FL Studio 21 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 Mac-安装包下载如下…

<网络安全>《45 网络攻防专业课<第十一课 - NTFS/EFS/BitLocker数据加密与解密>》

1 NTFS文件系统 磁盘加密 1.1 NTFS安全简介 NTFS是Windows 2000及之后的操作系统的标准文件系统。NTFS不仅在性能上比起FAT 32强&#xff0c;NTFS支持的最大文件大小、最大分区大小也比FAT32大&#xff0c;NTFS还支持配额、安全功能。 在NTFS分区中&#xff0c;对于某个文件或…

一个C#开发的大小只有8KB的贪吃蛇开源游戏!

大家好&#xff0c;我是编程乐趣。 今天给大家推荐基于C#开发的、一个贪吃蛇开源项目&#xff0c;这个项目除了实现贪吃蛇的功能外&#xff0c;重点是讲解如何把编译后的程序&#xff0c;从65MB精简为8KB。 项目地址 https://github.com/MichalStrehovsky/SeeSharpSnake 编译…

Java SourceDataLine 播放音频 显示频谱

Java SourceDataLine 播放MP3音频 显示频谱 1 添加依赖2 快速傅里叶变换2.1 FFT.java2.2 Complex.java 3 音频播放3.1 Player.java3.1 XPlayer.java 4 显示频谱5 结果 项目Value音频格式 添加依赖*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持…

vue3项目引入本地js文件,实现一个音频播放按钮

目前有一个需求就是在网页上放置一个音乐控制按钮&#xff0c;并且是在vue3项目里面。于是小白的我遇到了2个问题&#xff0c;第一个问题是如何实现没有进度条的播放按钮&#xff0c;这个网上有现成的代码&#xff0c;可以通过js代码切换不同的图片或者是别的样式&#xff0c;并…

SparkSQL学习02-编程入口

文章目录 1 DataFrame的构建方式方式一&#xff1a;JavaBean反射的方式1.1 创建Scala类1.2 创建Scala对象 方式二&#xff1a;动态编码的方式 2 DataSet的构建方式3 RDD和DataFrame以及DataSet之间的相互转换3.1【RDD-->DataFrame】和【RDD-->DataSet】3.2【DataFrame--&…

java基础之 SPI机制

SPI机制说明 什么是SPI Service Provider Interface 机制是Java提供的一套用来被第三方实现或扩展的API&#xff0c;他可以用来启用框架扩展和替换组件。通过“基于接口的编程 策略模式 配置文件”组合实现的动态加载机制。SPI机制为某个接口寻找服务实现的机制&#xff0c;…

二叉树基础知识总结

目录 二叉树基础知识 概念 : 根节点的五个形态 : 特殊的二叉树 满二叉树 : 完全二叉树 : 二叉搜索树 : 平衡二叉搜索树 : 二叉树的性质 : 二叉树的存储结构 二叉树的顺序存储结构 二叉树的链式存储结构 二叉树的遍历方式 : 基础概念 前中后遍历 层序遍历 :…

【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透 1、概念 缓存穿透&#xff08;查不到数据&#xff09;&#xff0c;是指当用户想要查询数据的时候&#xff0c;会先去Redis中取命中&#xff0c;如果Redis中没有该数据&#xff0c;那么就会向数据库中去查找数据。如果数据库中也没有&#xff0c;则该次查询结果失…

Spring学习笔记(五)--Spring的AOP模块

一、AOP的底层原理 AOP的底层原理是动态代理&#xff0c;动态代理有两种方式&#xff1a;JDK动态代理和CGLib动态代理&#xff0c;在有接口的实现类时我们通常用JDK的动态代理方式&#xff08;默认情况&#xff09;为类创建代理对象&#xff0c;JDK的动态代理方式可以实现无入…

ORM中常用的字段和参数,正反向概念

django表查询测试环境搭建 首先&#xff0c;在此之前我们先来回顾一下之前学习的orm内容 1. django自带一个小型的sqlite3的小型数据库 但是这个数据库的功能非常有限&#xff0c;并且针对日期类型的数据兼容性很差 2. 切换数据库数据(MySQL) 2.1 在django1.x版本中你需要在_…

PotPlayer+Alist挂载并播放网盘视频

文章目录 说明技术WebDAVPotPlayer 操作步骤一&#xff1a;Alist开启WebDAV代理二&#xff1a;PotPlayer连接Alist 说明 Alist网页端播放视频受限&#xff0c;主要是文件大于20MB&#xff0c;由于官方限制&#xff0c;无法播放需要使用user-agent修改插件&#xff0c;设置百度…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇

1.简介 在工作和生活中&#xff0c;经常会遇到我们需要进行选择的情况&#xff0c;比如勾选我们选择性别&#xff0c;男女两个性别总是不能同时选中的&#xff0c;再比如我们在选择兴趣爱好时&#xff0c;我们可以选择多个自己感兴趣的话题&#xff0c;比如&#xff1a;篮球、…

sqllabs第46关 order by 注入

简介&#xff1a;&#xff08;order by注入-错误回显-POST注入&#xff09; 请求方法&#xff1a;POST 方法&#xff1a;order by注入错误回显数字型注入 先了解下 order by参数注入&#xff1a; order by 注入是指其后面的参数是可控的&#xff0c; order by 不同于我们在 whe…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 官网教程&#xff1a;gem5: Classic caches 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用…

[java基础揉碎]this

引出this: 什么是this: java虚拟机会给每个对象分配 this&#xff0c;代表当前对象。 这里的this就是new出来的这个对象 this的本质: this是个引用在堆中指向它自己: this的细节: 访问成员方法: 访问构造器:

精英ECS Z97-MACHINE V1.0 BIOS MX25L6406E

官网上的两个BIOS我都无法亮机&#xff0c;这是我保存出来的BIOS&#xff0c;不知道是否能使用五代的处理器 官网&#xff1a;Z97-MACHINE&#xff5c;Motherboard&#xff5c;产品&#xff5c;ECS 精英电脑 国外老哥的看法&#xff1a;ECS Z97-MACHINE Closer Look: The BIO…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列&#xff08;定时消息&#xff09;6.重试队列7.死信队列8.消息语…

【电子书】游戏开发

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 游戏开发 ADOBE FLASH PROFESSIONAL CS6 标准培训教材.epubAndroid 3D 游戏案例开发大全.epubCocos Creator游戏开发实战.epubCocos2D-X游戏开发技术精解.epubCocos2d-JS游戏开发快速入门到实战…

《Python 语音转换简易速速上手小册》第3章 文本到语音的转换(2024 最新版)

文章目录 3.1 文本到语音的原理3.1.1 基础知识3.1.2 主要案例&#xff1a;自动新闻播报器案例介绍案例 Demo案例分析 3.1.3 扩展案例 1&#xff1a;智能助手案例介绍案例 Demo案例分析 3.1.4 扩展案例 2&#xff1a;电子书阅读器案例介绍案例 Demo案例分析 3.2 Python 中的文本…