繁体   English   中英

如何将十六进制文件数据转换为ASCII?

[英]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"""

只需正确地重新阅读您的问题,新答案即可:

  1. 不要在0x unhexlify前缀,因为它不能与unhexlify一起unhexlify ,甚至不能使字符串长度为偶数。
  2. 您需要均匀的字符串长度,因为每对十六进制数字代表一个字节(一个字符)
  3. unhexlify返回一个字节数组,可以使用.decode()将其解码为字符串
  4. 正如指出, 在这里你甚至都不需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM