【Python Intelhex- HEX文件修改器工具】
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數據錄入修改。做下記錄和分享。
提示:以下是本篇文章正文內容,下面案例可供參考
一、開發環境
python3
安裝pyqt5,
安裝 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 為定義的全局變量
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文件修改器工具】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SHA256sum系列命令检测文件完整性
- 下一篇: ERP项目实施| 准备工作、建议和注意事