将十六进制(字节)转换为奇数长度字符串的ASCII文本

时间:2019-06-14 12:00:13

标签: python hex ascii

我正在尝试编写将接受任何长度的十六进制(字节)为ASCII文本的转换器。这个在线作品很棒

https://www.rapidtables.com/convert/number/hex-to-ascii.html

但是,当我尝试执行以下操作时: binascii.unhexlify(data).decode('utf8') 它的 给我错误:奇数长度的字符串。或binascii.a2b_hex(data[:8]) (找到非十六进制数字)

是的,我已经尝试过strip(),但它仍然给出此错误

import binascii

text ="""
20 74 61 73 6B 3A 20 50 6C 75 6E 67 65 72 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 38 2C 20 74 61 73 6B 3A 20 4F 63 63 6C 75 73 69 6F 6E 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 38 2C 20 74 61 73 6B 3A 20 43 6C 61 6D 70 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 39 2C 20 74 61 73 6B 3A 20 4D 65 64 69 61 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 39 2C 20 74 61 73 6B 3A 20 4D 65 64 69 61 45 6E 67 69 6E 65 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 34 33 2C 20 74 61 73 6B 3A 20 49 6E 66 75 73 69 6F 6E 45 6E 67 69 6E 65 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 34 36 2C 20 74 61 73 6B 3A 20 43 6F 6D 6D 61 6E 64 20 67 6F 74 20 73 74 9F 60 02 06 00 D6 94 04 00 00
"""

new = binascii.a2b_hex(text.strip())
print(new)

所以我试图像这样逐个字符地将其转换为字符,但是我无法将这些代码转换为文本...

import binascii

file = "secret.bin"
decoded =  []

with open(file, "rb") as file:
    data = file.read()
    hex_list = data.split(" ")

ascii_data = [ binascii.b2a_hex(i) for i in hex_list] 

print(ascii_data)

1 个答案:

答案 0 :(得分:1)

您可以通过删除Odd-length string中的空格来消除text错误:

import binascii

text = """\
20 74 61 73 6B 3A 20 50 6C 75 6E 67 65 72 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 38 2C 20 74 61 73 6B 3A 20 4F 63 63 6C 75 73 69 6F 6E 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 38 2C 20 74 61 73 6B 3A 20 43 6C 61 6D 70 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 39 2C 20 74 61 73 6B 3A 20 4D 65 64 69 61 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 31 39 2C 20 74 61 73 6B 3A 20 4D 65 64 69 61 45 6E 67 69 6E 65 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 34 33 2C 20 74 61 73 6B 3A 20 49 6E 66 75 73 69 6F 6E 45 6E 67 69 6E 65 20 67 6F 74 20 73 74 61 74 65 3A 20 33 0A 53 59 53 20 54 69 6D 65 3A 20 32 34 36 2C 20 74 61 73 6B 3A 20 43 6F 6D 6D 61 6E 64 20 67 6F 74 20 73 74 9F 60 02 06 00 D6 94 04 00 00\
"""

new = binascii.a2b_hex(text.replace(' ',''))
print(new)

此外,由于您在三行中没有使用text定义了\变量,因此您在十六进制字符串中得到了一个\n,这就是您获得Non-hexadecimal digit found的原因错误。在行尾使用\或在一行上定义文本。