如何将十六进制文件数据转换为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""" 
+0

Tkinter的东西是无关紧要的。问题代码应该是一个专注于实际问题的[mcve]。该错误消息表明,您在arg中的字符是'binascii.unhexlify',它们不是有效的十六进制数字。做**不**先于'十六进制数据''0x'。这些数据可能还有其他问题。你可以发布一个典型的小样本数据吗? –

+0

谢谢你的回复,这是我的资料H247314748F8 HA010001FD –

只要正确重读你的问题,新的答案:

  1. 因为不要0x前缀它不适用于unhexlify,甚至不会使字符串长度均匀。
  2. 需要偶数串长度,由于各对己数字代表一个字节(即一个字符)
  3. unhexlify返回一个字节数组,其可被解码以使用.decode()
  4. 正如指出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仍然长短不均的,因为你增加了一个甚至字符的数量。