[英]How can I convert hexadecimal file data into ASCII?
我正在用python gui编写程序。 该程序的概念是当我们运行prgm时,它将要求以读取模式打开一个文件(witch包含十六进制值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"""
只需正确地重新阅读您的问题,新答案即可:
0x
unhexlify
前缀,因为它不能与unhexlify
一起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))
这将引发Error: Odd-length string
。 确保您确实想unhexilify
数据的固定化。 如文档中所述,您将需要偶数个十六进制字符,每对代表一个字节。
如果您想将十六进制数字转换为十进制整数 ,请尝试以下一种方法:
list(map(lambda hx: int(hx,16),"H247314748F8 HA010001FD".replace("H","").split(" ")))
int(string, base)
将从一个数字系统(十六进制以16为int(string, base)
转换为十进制(以10为底)。
** 无关 **
if len(z) % 2:
z = '0' + 'x' + z
由于您添加了偶数个字符,将导致z的长度仍然不均匀。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.