日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python Intelhex- HEX文件修改器工具】

發布時間:2023/12/15 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 為定義的全局變量

    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文件修改器工具】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。