Преобразование и печать шестнадцатеричной строки в байт

#python

Вопрос:

У меня есть строка в Python, содержащая некоторую шестнадцатеричную информацию (длина 256) следующим образом:

 Str0 = '04008020546c359986812644420e453113e209afeaaeeb316f3a07000000000000000000b8fa13b3fca087c1456daac626ab9b8a47eae821a326f17e0ffffc15433df709b0f718610b1812175a5c9544800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280'
 

Эта строка шестнадцатеричная, и нам нужно создать байтовую строку, используя ее. Затем выведите один байт (его числовое значение) для каждой новой строки.

Я думал, что это сработает, но это не так:

 bytes_object = bytes.fromhex(Str0)

ascii_string = bytes_object.decode('ASCII')
 

Ошибка: кодек ascii не может декодировать байт 0x80 в позиции 2: порядковый номер не в диапазоне(128)

Комментарии:

1. Конечно, ваша bytes_object переменная-это то, что вам нужно?

2. просто число для каждого байта в новой строке. Например: 40 128 и так далее..

Ответ №1:

Первая строка: bytes_object = bytes.fromhex(Str0) предоставляет тип байтов, который функционирует как необработанные байтовые данные / массив байтов. чтобы напечатать числовое значение каждого байта, вам нужно сделать следующее: for x in bytes_object : print(x) Если вам нужен массив числовых значений, которые вы можете использовать [int(x) for x in bytes_object]

Ответ №2:

В шестнадцатеричном формате каждые 2 символа представляют собой байт. Таким образом, из вашей шестнадцатеричной строки соответствующие байты будут:

 0: 0x04 (decimal: 4)
1: 0x00 (decimal: 0)
2: 0x80 (decimal: 128)
3: 0x20 (decimal: 32)
... etc.
 

Преобразование этой строки в байты нормально, так как байт может иметь любое значение от 0 до 255.

Проблема в том, что вы пытаетесь расшифровать его как ASCII. Если вы посмотрите на таблицу ASCII, вы увидите, что максимальное значение в таблице равно 127 (0x7F). Байт в позиции [2], который вы пытаетесь декодировать, имеет шестнадцатеричное значение 0x80 (десятичное значение 128), которое не является допустимым символом ASCII.

Итак, вопрос в том, откуда взялась ваша исходная шестнадцатеричная строка и что заставляет вас думать, что она представляет допустимые символы ASCII?

Комментарии:

1. Первая часть, о которой я знаю. Строка представляет собой хэш-значение некоторых данных, и мне она нужна в байтовом формате, чтобы ее можно было ввести в SHA256 в качестве входных данных. Он может не представлять ASCII, все, что я хочу, это преобразовать его в байтовую строку с числовым значением для каждого байта.

2. Тогда вам не нужна линия ascii_string = bytes_object.decode('ASCII') . Удалите эту строку и просто используйте bytes_object для ввода SHA256.