如何将十六进制文件数据转换为ASCII?
问题描述:
正在用python写一个程序gui。该程序的概念是当我们运行prgm时,它会要求打开一个文件(女巫包含十六进制值为TASK.txt)和读取模式。将一行的数据存储在一个变量中。 如何将该数据转换为ascii值。对Python来说是新的。这是我的代码:如何将十六进制文件数据转换为ASCII?
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
返回一个字节数组,其可被解码以使用.decode()
- 正如指出here字符串你甚至都不需要
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
你的数据。如docs中所述,您需要偶数个十六进制字符,每对代表一个字节。
如果你想在十六进制数转换为十进制整数数字转换相反,试试这个:
list(map(lambda hx: int(hx,16),"H247314748F8 HA010001FD".replace("H","").split(" ")))
int(string, base)
将从一个数字系统(十六进制具有基数为16)转换为十进制(基数为10 )。
**题外话**
if len(z) % 2:
z = '0' + 'x' + z
会导致到Z仍然长短不均的,因为你增加了一个甚至字符的数量。
Tkinter的东西是无关紧要的。问题代码应该是一个专注于实际问题的[mcve]。该错误消息表明,您在arg中的字符是'binascii.unhexlify',它们不是有效的十六进制数字。做**不**先于'十六进制数据''0x'。这些数据可能还有其他问题。你可以发布一个典型的小样本数据吗? –
谢谢你的回复,这是我的资料H247314748F8 HA010001FD –