Преобразование шестнадцатеричных (байтов) в текст ASCII в строку нечетной длины - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь написать конвертер, который будет принимать любую шестнадцатеричную (байтовую) длину в текст 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)

Итак, я попытался преобразовать его в тип char, как этот, но я не могу поместить эти коды в текст ...

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 Ответ

1 голос
/ 14 июня 2019

Вы можете удалить ошибку 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.Либо используйте \ в конце строки, либо определите текст в одной строке.

...