Python Intelhex- HEX文件修改器工具

提示:文章写完后,目录可

以自动生成,如何生成可参考右边的帮助文档

文章目录

    • Python Intelhex- HEX文件修改器工具
  • 前言
  • 一、开发环境
  • 二、搭建窗口界面
  • 三、功能的实现和intelhex库的使用
    • 1、利用窗口中的QFileDialog控件按钮,读取加载需要修改的HEX文件
    • 2、使用Intelhex库对Hex文件进行修改
  • 四.最终成品效果
    • 1、修改前的HEX文件
    • 2、运行该脚本进行修改HEX文件
    • 2、修改后内容
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:

前言:在进行IAP升级开发时(基于CAN的UDS FOTA功能),往往需要对App的固件进行修改,增加响应的版本号相关信息,有时还需要将HEX文件转换成bin文件。故利用python + pyqt5 开发一款修改hex文件并生成bin文件的小工具,可视化界面,支持ASCII字符录入或者HEX数据录入修改。做下记录和分享。


提示:以下是本篇文章正文内容,下面案例可供参考

一、开发环境

  1. python3

  2. 安装pyqt5,

  3. 安装 intelhex 库 , window cmd下使用pip安装 pip install intelhex

二、搭建窗口界面

利用designer 工具搭建窗口界面,并利用pyuic5 库将ui文件转换成对应的界面的py文件,
pyuic5 -o xxxxx.py yyyyyy.ui 。
界面的搭建,网上有很多资料,这里不是本文重点,这里就不再说了。

三、功能的实现和intelhex库的使用

1、利用窗口中的QFileDialog控件按钮,读取加载需要修改的HEX文件

关键语句: ORIG_HEX_FILE = IntelHex(ORIG_HEX_FILE_PATH_STR)
ORIG_HEX_FILE 为定义的全局变量

def openload_hexfile(self):global ORIG_HEX_FILEglobal ORIG_HEX_FILE_PATH_STRfile_path = QFileDialog.getOpenFileName(self, "打开文件", "/", "*.hex")try:ORIG_HEX_FILE_PATH_STR = str(file_path[0])ORIG_HEX_FILE = IntelHex(ORIG_HEX_FILE_PATH_STR) #利用IntelHex库打开读取HEX文件#显示文件路径文件名self.le_hexfile_path.clear() #清空当前文本self.le_hexfile_path.setText(ORIG_HEX_FILE_PATH_STR) self.pb_start_edit.setEnabled(True) #功能键使能except:pass

2、使用Intelhex库对Hex文件进行修改

从窗体界面获取相关信息后,点击一键修改后,即可完成对hex文件的修改,并对修改后的hex文件进行重命名另存,并同时生成bin文件,保存到原hex文件所在的目录下。主要功能代码如下:

# 修改文件def edit_hexfile(self):global ORIG_HEX_FILEglobal ORIG_HEX_FILE_PATH_STRenable_saveas_edithex = Falsehexfile_edit_setaddr = int(self.le_edit_addr.text(),base=16)hexfile_edit_setsize = int(self.le_edit_size.text(),base=10)hexfile_edit_padding = int(self.le_edit_padding.text(),base=16)#--------------- HEX模式------------------------------------------------------------if self.cb_hex_mode.isChecked():#删除所有非十六进制的字符input_s = ''text_tmp = self.te_edit_text.toPlainText()text_tmp = text_tmp.replace('0x','')text_tmp = text_tmp.replace('0X','')for char in text_tmp:if isHexChar(char):input_s += charinput_s_len = len(input_s)if input_s_len % 2:QMessageBox.critical(self, "输入内容长度错误", "长度为奇数,请输入正确长度的内容!")elif input_s_len == 0:origbinfile_path_str = ORIG_HEX_FILE_PATH_STR[:ORIG_HEX_FILE_PATH_STR.find(".")] + ".bin"ORIG_HEX_FILE.tobinfile(origbinfile_path_str) #save as binfileQMessageBox.information(self, "转换成功", "未修改HEX文件仅转换为bin文件!")else:hexbyte_list = [] len_index = 0while len_index < input_s_len:byte_temp = int(input_s[len_index:len_index+2],base=16)hexbyte_list.append(byte_temp)len_index = len_index + 2hexbyte_list_len = len(hexbyte_list)if hexbyte_list_len > hexfile_edit_setsize:QMessageBox.critical(self, "输入内容长度错误", "长度过长,请输入正确长度的内容!")else:current_addr = hexfile_edit_setaddrfor i in range(hexbyte_list_len):ORIG_HEX_FILE[current_addr+i] = hexbyte_list[i]diff_size = hexfile_edit_setsize - hexbyte_list_lenif diff_size > 0:current_addr = hexfile_edit_setaddr + hexbyte_list_lenfor i in range(diff_size):ORIG_HEX_FILE[current_addr+i] = hexfile_edit_paddingenable_saveas_edithex = True# -------------ASCII码模式------------------------------------------------------------------else:hexfile_edit_context = self.te_edit_text.toPlainText()hexfile_edit_context_len = len(hexfile_edit_context)if hexfile_edit_context_len > hexfile_edit_setsize:QMessageBox.critical(self, "输入内容长度错误", "长度过长,请输入正确长度的内容!")elif hexfile_edit_context_len == 0:origbinfile_path_str = ORIG_HEX_FILE_PATH_STR[:ORIG_HEX_FILE_PATH_STR.find(".")] + ".bin"ORIG_HEX_FILE.tobinfile(origbinfile_path_str) #save as binfileQMessageBox.information(self, "转换成功", "未修改HEX文件仅转换为bin文件!")else:ORIG_HEX_FILE.putsz(hexfile_edit_setaddr,hexfile_edit_context)diff_size = hexfile_edit_setsize - hexfile_edit_context_lenif diff_size > 0:current_addr = hexfile_edit_setaddr + hexfile_edit_context_lenfor i in range(diff_size):ORIG_HEX_FILE[current_addr+i] = hexfile_edit_paddingenable_saveas_edithex = True#----------- 开始另存------------------------------------------------------------------ if enable_saveas_edithex:# 获取当前时间current_time = int(time.time())# 转换为localtimelocaltime = time.localtime(current_time)# 利用strftime()函数重新格式化时间time_str = time.strftime('%Y%m%d%H%M', localtime)time_str = time_str[2:]#save as new hexfilenewhexfile_path_str = ORIG_HEX_FILE_PATH_STR[:ORIG_HEX_FILE_PATH_STR.find(".")] + "_Fota_" + time_str + ".hex"ORIG_HEX_FILE.tofile(newhexfile_path_str, format='hex') #save as new binfilenewbinfile_path_str = newhexfile_path_str[:newhexfile_path_str.find(".")] + ".bin"ORIG_HEX_FILE.tobinfile(newbinfile_path_str) QMessageBox.information(self, "修改成功", "已成功修改HEX文件并另存,同时生成bin文件!")

四.最终成品效果

1、修改前的HEX文件

App的hex固件,偏移地址是0x8010000,

2、运行该脚本进行修改HEX文件

我们的需求是在该文件头插入32个字节的文件信息,其中16个字节为有效信息,后16个字节为无效填充信息,填充字节为0xFF.

在原文件目录下生成了修改后hex文件和对应的bin文件。

2、修改后内容

看出在该hex文件头部插入了我们需求的32个字节的信息。

总结

这里代码只是简单介绍了如何使用intelhex库修改hex文件。对于pyqt窗体的应用没有做过多的描述。同时也可以将该脚本打包成.exe可执行文件,网上也有很多教程。
完整工程和源码已上传,可供参考。
https://download.csdn.net/download/yinzimu/85100462

【Python Intelhex- HEX文件修改器工具】相关推荐

  1. 基于腾讯COS对象存储SDK使用Python编写的文件上传工具第二版

    更多技术文章请访问我的个人博客http://www.rain1024.com NR-TCloud 1.1,更新于2017-02-08 更新说明: 第一版上传时需要将upload.pyc复制到要上传对象 ...

  2. 后悔药!DeepFaceLab Dat文件修改器

    有些朋友想把自己的SAE模型从全脸改成半脸,怎么办呢?有两个办法,一个是重新建立一个模型,参数和旧模型参数一致,只是在face_type处选择为半脸h,训练一步出预览窗口后保存退出.然后将原来的模型数 ...

  3. python怎么制作游戏修改器_如何使用CE来修改游戏并制作一个修改器

    1 首先下载CE,地址在参考资料里面.http://pan.baidu.com/s/1hqkrPcC打开后启动Cheat Engine.exe和练习软件Tutorial.exe 打开之前最好关闭杀毒软 ...

  4. 24位ADC数据转换,保存为hex文件,并利用python解析hex文件画图

     目前有许多ADC芯片都是24位精度的,这个位数稍显尴尬,因为在常用的变量类型中,有8bit.16bit.32bit,唯独没有24bit,这就导致我们在很多情况下,需要自己敲代码去处理这个24bit的 ...

  5. python怎么制作游戏修改器_使用python编写游戏修改器

    最近比较怀旧,在玩一个比较老的PC游戏.由于游戏难度太高了,于是就打算自己写一个修改器. 通过查阅资料,在 Windows 下的修改器主要需要用到四个函数:OpenProcess, CloseHand ...

  6. python怎么制作游戏修改器_Mancala (Python Edition)游戏修改器_九游手机游戏

    Mancala (Python Edition)游戏修改器游戏攻略 Mancala is an ancient family of board games. This version is known ...

  7. 服务器gs文件修改器,NBA2K17L大修改器用法 使用第三方名单和GS教程

    作为一个从NBA2K12开始玩的玩家,我每一代都会使用修改器.这一代也不例外. 说真的,我一开始也以为L大修改器和以前一样,改改动作啊 改改能力值啊. 但慢慢玩下去才发觉这一次L大修改器在我心目中可以 ...

  8. python磁盘垃圾文件清理器实验_Deletor(磁盘垃圾文件清理助手)V5.0.3 官方版

    Deletor(磁盘垃圾文件清理助手)是一款很方便好用的磁盘清理辅助工具.如果你需要一款好用的磁盘清理工具,小编带来的这款Deletor软件是很不错的选择,功能强大,操作简单,使用后用户就能轻松便捷的 ...

  9. 去虚拟化 VMware Workstation Pro去虚拟化底层文件修改器

    学习C++写的一个工具,仿照网上的写的. 还只完成了一部分,下面再接着写

最新文章

  1. Google Map API 开发基础--01
  2. mysql安装check requirements出错_精心整理的mysql主从监控脚本,值得收藏
  3. CSS上下左右居中的几种方法
  4. Java并发编程的艺术(一)——并发编程需要注意的问题
  5. DCMTK:将DICOM文件的内容转换为XML格式
  6. 图表插件Highcharts的动态化赋值,实现图表数据的动态化设置显示
  7. CSS3 outline-offset 属性 项目中input会遇到
  8. iPhone用户忠诚度降至8年来最低 三星微微一笑...
  9. treeview找到节点并展开_我们从100个经典韩剧中,找到8个「神套路」,这样写抖音剧本个个都是爆款!...
  10. [BZOJ4913][SDOI2017]遗忘的集合
  11. Android设计模式(1)----单例模式
  12. Android 读取手机归属地
  13. oracle 删除用户命令和部分表空间操作
  14. 犀牛建立html格式,犀牛基础操作图文教程,教你rhino如何导出cad文件格式
  15. IDEA中自动导包快捷键
  16. 80ms 求解世上最难数独 —— DFS的灵活运用
  17. word如何添加艺术字体
  18. xxl-job分布式任务调度的使用
  19. 开发第三方分账系统需要多少钱?
  20. 如何用计算机给闺蜜表白,闺蜜情话最暖心短句50句

热门文章

  1. Win7笔记本电脑启用虚拟WIFI共享上网
  2. 高德地图之添加遮盖物
  3. Dubbo的示例文档
  4. win10系统怎么禁用某个程序联网,阻止软件联网
  5. IndexedDB 实践
  6. Kafka GroupCoordinator机制(十六):GroupCoordinator之LeaveGroupRequest分析
  7. DFC Session Management Srinivas Jakkula
  8. PS笔刷:150个天气套装
  9. 一篇快速解决Nginx Post请求405 (Not Allowed)异常的方案
  10. 又一年没有中国队的世界杯,你还会熬夜打call吗?网友的回答亮了