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

2024-04-27 17:33:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pythongui编写一个程序。这个程序的概念是当我们运行prgm时,它会要求打开一个文件(其中包含十六进制值任务.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()

这是我得到的错误:

^{pr2}$

Tags: 文件数据fromimport程序txt概念tkinter
1条回答
网友
1楼 · 发布于 2024-04-27 17:33:52

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

  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为前缀,必须删除该字符串。你已经这样做了,但我认为可以用一种更好的方式:

^{pr2}$

这将抛出一个Error: Odd-length string。请确定您确实想^{}您的数据。如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的长度仍然不均匀,因为您添加了偶数个字符。在

相关问题 更多 >