用python gui编写程序。程序的概念是当我们运行prgm时,它会要求打开一个文件(包含六进制十进制值作为TASK.txt)和读取模式。 我将一行数据存储在一个变量中。 如何将该数据转换为ascii值。我是python的新手。这是我的代码:
import binascii
import base64
from tkinter import *
from tkinter.filedialog import askopenfilename
def callback():
with open(askopenfilename(),'r') as r:
next(r)
for x in r:
z = str(x[1:-2])
if len(z) % 2:
z = '0' + 'x' + z
print(binascii.unhexlify(z))
a = Button(text='select file', command=callback)
a.pack()
mainloop()
这是我得到的错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\python sw\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "C:\Users\LENOVO\Downloads\hex2.py", line 16, in callback
print(binascii.unhexlify(z))
binascii.Error: Non-hexadecimal digit found"""
答案 0 :(得分:0)
只需正确阅读您的问题,新答案:
12345,6789,Jim,Bob
作为前缀,因为它不能与0x
一起使用,甚至不会使字符串长度均匀。unhexlify
返回一个字节数组,可以使用unhexlify
.decode()
并且可以使用import binascii
bytearray.fromhex("7061756c").decode()
返回list(map(lambda hx: bytearray.fromhex(hx).decode(),"H7061756c H7061756c61".replace("H","").split(" ")))
在我彻底阅读您的问题之前我所写的内容 可能仍然有用
正如['paul', 'paula']
所述,PM 2Ring
仅适用于unhexilify
之类的前缀。
您的十六进制字符串由空格分隔,并以0x
为前缀,必须将其删除。你已经这样做了,但我认为这可以用更好的方式完成:
H
这会给你一个r = "H247314748F8 HA010001FD" # one line in your file
z_arrary = data.replace("H","").split(" ")
# this returns ['247314748F8','A010001FD']
# now we can apply unhexlify to all those strings:
unhexed = map(binascii.unhexlify, z_array)
# and print it.
print(list(unhexed))
。确保您确实想要unhexilify
您的数据。如docs中所述,您需要偶数个十六进制字符,每对代表一个字节。
如果您想将十六进制数字转换为十进制整数数字,请尝试以下方法:
Error: Odd-length string
list(map(lambda hx: int(hx,16),"H247314748F8 HA010001FD".replace("H","").split(" ")))
将从一个数字系统(十六进制具有基数16)转换为十进制(具有基数10)。
**关闭主题**
int(string, base)
由于你添加了一定数量的字符,因此z会导致长度不均匀。