Python-01 Base64转换为Hex
第一个python程序编写的小工具,提取网页xml文件中ECU key编码对应的base64字符串并将其转换为Hex格式的编码。优化GUI界面设计使其更加人性化的。
功能介绍:
1. 点击按钮“Openkey xml file",选择加载需要待解析的xmlkey文件。
2. 点击按钮“Conversion",实现Base64到Hex字符串的功能转换。
3. 点击按钮 "Open Key Txt"打开记录字符串编码转换的txt格式文件。Output Key file记录txt文件名以及存储在运行程序下的路径。
Python主程序源代码:
主程序需要引用以下第三方库,其中包含部分Python自带的库函数
库名 | 用途 | 是否需要额外安装 |
xml.dom.mindom | 用于解析xml格式文件 | 自带库 |
base64 | Base64字符串转化为Hex | 自带库 |
sys | 向txt文档输入多行文本 | 自带库 |
os | 打开txt文本 | 自带库 |
PyQt | GUI界面设计调用 | 需要额外安装 |
BaseToHex.py
#2020-09-16 Base64 To Hex @翔哥
#coding=utf-8import xml.dom.minidomimport base64import sysimport os#调用PyQt5生成的GUI界面需要导入的库from KeyConver import Ui_MainWindowfrom PyQt5.QtWidgets import QMainWindow,QApplication,QPushButton, QFileDialog,QStyleFactoryimport global_variant as glclass DemoMain(QMainWindow,Ui_MainWindow):def __init__(self,parent=None):super(DemoMain,self).__init__(parent)#self.initUI(self)self.setupUi(self) #调用Ui_Mainwindow中的函数setupUi实现显示界面#add funtion to buttonself.pushButton_ChooseFile.clicked.connect(self.open_file)self.pushButton_ConverKey.clicked.connect(self.display)self.pushButton.clicked.connect(self.open_txt)def initUI(self):self.desktop=QApplication.desktop()#获取显示器分辨率self.screenRect = self.desktop.screenGeometry()self.height = self.screenRect.height()self.width = self.screenRect.width()self.show()def open_file(self):
current_dir = __file__[:__file__.rfind('/')]
gl.file_address =QFileDialog.getOpenFileName(self, "choose ", current_dir)[0]self.lineEdit.setText(gl.file_address)self.getxml()def open_txt(self):
os.system(gl.filepath)# base64解码解析为HEX codedef base64_decode(self,keycode):
temp =base64.b64decode(keycode).hex()return str.upper(temp)def getxml(self):
dom =xml.dom.minidom.parse(gl.file_address) # 打开xml文档root =dom.documentElement # 得到文档元素对象XdlUnnlock =dom.getElementsByTagName('key')
XdlUnnlockRead = XdlUnnlock[0]
gl.Base64Read =XdlUnnlockRead.firstChild.data # 获得标签对之间的数据 即获取XdlUnnlockRead对应的字符串密码gl.HexRead = self.base64_decode(gl.Base64Read)
XdlUnnlockWrite = XdlUnnlock[1]
gl.Base64Write =XdlUnnlockWrite.firstChild.data # 获得标签对之间的数据 即获取XdlUnnlockWrite对应的字符串密码gl.HexWrite = self.base64_decode(gl.Base64Write)
XdlUnnlockExcute = XdlUnnlock[2]
gl.Base64Excute =XdlUnnlockExcute.firstChild.data # 获得标签对之间的数据 即获取XdlUnnlockExcute对应的字符串密码gl.HexExcute = self.base64_decode(gl.Base64Excute)# 获取标签的属性 即获取ECU的硬件版本号以及序列号itemlist =root.getElementsByTagName('ecu')
item = itemlist[0]
gl.SerialNumber =item.getAttribute("serialNumber")
gl.ECUTemicNumber =gl.SerialNumber[0:2] +"."+gl.SerialNumber[2:6]+"-"+gl.SerialNumber[6:10]+"."+gl.SerialNumber[10]
gl.ECUSerialNumber =gl.SerialNumber[15:]
gl.filepath = gl.ECUTemicNumber + "_" +gl.ECUSerialNumber + ".txt"def display(self):self.getxml()self.lineEdit_ECUPN.setText(gl.ECUTemicNumber)self.lineEdit_3.setText(gl.ECUSerialNumber)self.lineEdit_4.setText(gl.Base64Read)self.lineEdit_5.setText(gl.Base64Write)self.lineEdit_6.setText(gl.Base64Excute)self.lineEdit_7.setText(gl.HexRead)self.lineEdit_8.setText(gl.HexWrite)self.lineEdit_9.setText(gl.HexExcute)self.lineEdit_2.setText(gl.filepath)## 输出Txt文本文件current =sys.stdout # 保存当前的sys.stdout状态, 开始捕获当前的输出textFile = open(gl.filepath,"wt")
sys.stdout = textFile # 这一步实际是sys.stdout.write, 当sys捕获到了print输出的时候, 就写入textFile里面print("ECU TemicP/N : {}".format(gl.ECUTemicNumber))print("ECU SerialNumber: {}\n".format(gl.ECUSerialNumber))print("XdlUnlockReadBase 64 is: \n{} \nXdlUnlockRead HEX strings:\n{} \n".format(gl.Base64Read,gl.HexRead))print( "XdlUnlockWriteBase 64 is: \n{} \nXdlUnlockWrite HEX strings:\n{} \n".format(gl.Base64Write,gl.HexWrite))print("XdlUnlockExcuteBase 64 is: \n{} \nXdlUnlockExcute HEX strings:\n{} \n".format(gl.Base64Excute,gl.HexExcute))
sys.stdout = current #恢复状态,之后的print内容不再捕获textFile.close()if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create("Windows")) # ['windowsvista', 'Windows', 'Fusion']Win_Base64toHex =DemoMain()
Win_Base64toHex.show()
sys.exit(app.exec_())
全局变量的定义文件
global_variant.py
global SerialNumberglobal file_addressglobal Base64Excuteglobal Base64Writeglobal Base64Readglobal HexExcuteglobal HexWriteglobal HexReadglobal ECUTemicNumberglobal ECUSerialNumberglobal filepath
PyQt5-tools 设计自动编译生成的KeyConver.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'KeyConver.ui'
# Created by: PyQt5 UI code generator 5.15.0#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.frmPyQt5import QtCore, QtGui, QtWidgetsclassUi_MainWindow(object):def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(585, 346)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)
MainWindow.setFont(font)
MainWindow.setStatusTip("")
MainWindow.setAnimated(False)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)self.gridLayout.setObjectName("gridLayout")self.label_7 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_7.setFont(font)self.label_7.setTextFormat(QtCore.Qt.RichText)self.label_7.setAlignment(QtCore.Qt.AlignCenter)self.label_7.setObjectName("label_7")self.gridLayout.addWidget(self.label_7, 5, 6, 1, 1)self.label_3 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_3.setFont(font)self.label_3.setTextFormat(QtCore.Qt.RichText)self.label_3.setObjectName("label_3")self.gridLayout.addWidget(self.label_3, 6, 0, 1, 1)self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_5.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.lineEdit_5.setFont(font)self.lineEdit_5.setObjectName("lineEdit_5")self.gridLayout.addWidget(self.lineEdit_5, 7, 1, 1, 4)self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_3.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setBold(False)
font.setWeight(50)self.lineEdit_3.setFont(font)self.lineEdit_3.setObjectName("lineEdit_3")self.gridLayout.addWidget(self.lineEdit_3, 3, 6, 1, 1)self.label_Title_2 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_Title_2.setFont(font)self.label_Title_2.setTextFormat(QtCore.Qt.RichText)self.label_Title_2.setAlignment(QtCore.Qt.AlignCenter)self.label_Title_2.setObjectName("label_Title_2")self.gridLayout.addWidget(self.label_Title_2, 11, 5, 1, 2)self.lineEdit_8 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_8.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setBold(False)
font.setWeight(50)self.lineEdit_8.setFont(font)self.lineEdit_8.setObjectName("lineEdit_8")self.gridLayout.addWidget(self.lineEdit_8, 7, 5, 1, 2)self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_2.setObjectName("lineEdit_2")self.gridLayout.addWidget(self.lineEdit_2, 10, 1, 1, 6)self.lineEdit_9 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_9.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setBold(False)
font.setWeight(50)self.lineEdit_9.setFont(font)self.lineEdit_9.setObjectName("lineEdit_9")self.gridLayout.addWidget(self.lineEdit_9, 8, 5, 1, 2)self.label = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label.setFont(font)self.label.setTextFormat(QtCore.Qt.RichText)self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 3, 0, 1, 1)self.lineEdit_7 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_7.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.lineEdit_7.setFont(font)self.lineEdit_7.setObjectName("lineEdit_7")self.gridLayout.addWidget(self.lineEdit_7, 6, 5, 1, 2)self.label_4 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_4.setFont(font)self.label_4.setTextFormat(QtCore.Qt.RichText)self.label_4.setObjectName("label_4")self.gridLayout.addWidget(self.label_4, 7, 0, 1, 1)self.lineEdit_6 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_6.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.lineEdit_6.setFont(font)self.lineEdit_6.setObjectName("lineEdit_6")self.gridLayout.addWidget(self.lineEdit_6, 8, 1, 1, 4)self.label_8 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_8.setFont(font)self.label_8.setTextFormat(QtCore.Qt.RichText)self.label_8.setObjectName("label_8")self.gridLayout.addWidget(self.label_8, 10, 0, 1, 1)self.label_5 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_5.setFont(font)self.label_5.setTextFormat(QtCore.Qt.RichText)self.label_5.setObjectName("label_5")self.gridLayout.addWidget(self.label_5, 8, 0, 1, 1)self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit.setEnabled(False)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.lineEdit.setFont(font)self.lineEdit.setObjectName("lineEdit")self.gridLayout.addWidget(self.lineEdit, 2, 1, 1, 6)self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_4.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.lineEdit_4.setFont(font)self.lineEdit_4.setObjectName("lineEdit_4")self.gridLayout.addWidget(self.lineEdit_4, 6, 1, 1, 4)self.label_2 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_2.setFont(font)self.label_2.setTextFormat(QtCore.Qt.RichText)self.label_2.setObjectName("label_2")self.gridLayout.addWidget(self.label_2, 3, 4, 1, 2)self.lineEdit_ECUPN = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_ECUPN.setEnabled(True)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setBold(False)
font.setWeight(50)self.lineEdit_ECUPN.setFont(font)self.lineEdit_ECUPN.setObjectName("lineEdit_ECUPN")self.gridLayout.addWidget(self.lineEdit_ECUPN, 3, 1, 1, 3)self.pushButton_ConverKey = QtWidgets.QPushButton(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(14)
font.setBold(False)
font.setWeight(50)self.pushButton_ConverKey.setFont(font)self.pushButton_ConverKey.setObjectName("pushButton_ConverKey")self.gridLayout.addWidget(self.pushButton_ConverKey, 4, 3, 1, 2)self.pushButton_ChooseFile = QtWidgets.QPushButton(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(14)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)self.pushButton_ChooseFile.setFont(font)self.pushButton_ChooseFile.setObjectName("pushButton_ChooseFile")self.gridLayout.addWidget(self.pushButton_ChooseFile, 1, 3, 1, 3)self.label_Title = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_Title.sizePolicy().hasHeightForWidth())self.label_Title.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(18)
font.setBold(True)
font.setWeight(75)self.label_Title.setFont(font)self.label_Title.setTextFormat(QtCore.Qt.RichText)self.label_Title.setAlignment(QtCore.Qt.AlignCenter)self.label_Title.setObjectName("label_Title")self.gridLayout.addWidget(self.label_Title, 0, 2, 1, 4)self.label_6 = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)self.label_6.setFont(font)self.label_6.setTextFormat(QtCore.Qt.RichText)self.label_6.setAlignment(QtCore.Qt.AlignCenter)self.label_6.setObjectName("label_6")self.gridLayout.addWidget(self.label_6, 5, 2, 1, 2)self.pushButton = QtWidgets.QPushButton(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setBold(False)
font.setWeight(50)self.pushButton.setFont(font)self.pushButton.setObjectName("pushButton")self.gridLayout.addWidget(self.pushButton, 9, 3, 1, 2)
MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 585, 18))self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.label_7.setText(_translate("MainWindow", "Hex"))self.label_3.setText(_translate("MainWindow", "XdlUnlockRead:"))self.label_Title_2.setText(_translate("MainWindow", "X. Yu@ Continetal VED R&D China"))self.label.setText(_translate("MainWindow", "ECU Temic P/N :"))self.label_4.setText(_translate("MainWindow", "XdlUnlockWrite:"))self.label_8.setText(_translate("MainWindow", "Output file:"))self.label_5.setText(_translate("MainWindow", "XdlUnlockExecute:"))self.label_2.setText(_translate("MainWindow", "ECU Serial Number :"))self.pushButton_ConverKey.setText(_translate("MainWindow", "Conversion"))self.pushButton_ChooseFile.setText(_translate("MainWindow", "Open key xml file"))self.label_Title.setText(_translate("MainWindow", "Base64 to Hex Conversion Tool V1.0"))self.label_6.setText(_translate("MainWindow", "Base 64"))self.pushButton.setText(_translate("MainWindow", "Open Key txt"))
以上为该程序的全部源代码。
关于UI界面设计出来之后,在不同分辨率的屏幕上面运行出现控件和字体变形状态。
可以通过设置“布局”—>“栅格布局(G)”来解决这个问题。设置之后,GUI界面被一体化,可以通过整体缩放。
最后,生成可执行程序.exe文件,运用cmd窗口pyinstaller指令生成。-w 用于不显示命令行窗体。
pyinstaller -F -w D:\Documents\Python\Base64ToHex.py
Python的第一个小程序运用就分享到这里了,欢迎有问题下方留言探讨。