【问题标题】:How can I convert hexadecimal file data into ASCII?如何将十六进制文件数据转换为 ASCII?
【发布时间】:2017-02-14 06:46:41
【问题描述】:

我正在用 python gui 编写一个程序。该程序概念是当我们运行 prgm 时,它会要求以读取模式打开一个文件(女巫包含作为 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"""

【问题讨论】:

  • Tkinter 的东西是无关紧要的。问题代码应该是关注实际问题的minimal reproducible example。错误消息说您在 binascii.unhexlify 的 arg 中有字符不是有效的十六进制数字。 不要在十六进制数据前添加 '0x'。该数据可能存在其他问题。你能发布一个小的典型数据样本吗?
  • 感谢您的回复这是我的数据 H247314748F8 HA010001FD

标签: python django python-2.7 python-3.x ipython


【解决方案1】:

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

  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 仍然是不均匀的长度,因为您添加了偶数数量的字符。

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2017-08-28
    • 2017-10-13
    • 2011-11-21
    相关资源
    最近更新 更多