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

时间:2017-02-14 06:46:42

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

用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"""

1 个答案:

答案 0 :(得分:0)

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

  1. 请勿使用12345,6789,Jim,Bob 作为前缀,因为它不能与0x一起使用,甚至不会使字符串长度均匀。
  2. 您需要一个偶数字符串长度,因为每对十六进制数字代表一个字节(是一个字符)
  3. unhexlify返回一个字节数组,可以使用unhexlify
  4. 将其解码为字符串
  5. 指出here您甚至不需要.decode()并且可以使用import binascii
  6. 转换十六进制到字符串
    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)) 。确保您确实想要unhexilify您的数据。如docs中所述,您需要偶数个十六进制字符,每对代表一个字节。

    如果您想将十六进制数字转换为十进制整数数字,请尝试以下方法:

    Error: Odd-length string

    list(map(lambda hx: int(hx,16),"H247314748F8 HA010001FD".replace("H","").split(" "))) 将从一个数字系统(十六进制具有基数16)转换为十进制(具有基数10)。

    **关闭主题**

    int(string, base)

    由于你添加了一定数量的字符,因此z会导致长度不均匀。