У меня есть длинная шестнадцатеричная строка, представляющая ряд значений разных типов. Я хочу преобразовать эту шестнадцатеричную строку в байтовый массив, чтобы я мог сдвинуть каждое значение и преобразовать его в соответствующий тип данных.
150
Ответы:
Предположим, что ваша шестнадцатеричная строка похожа на
Преобразуйте его в строку (Python ≤ 2.7):
или начиная с Python 2.7 и Python 3.0:
Обратите внимание, что
bytes
это неизменяемая версияbytearray
.источник
string
->bytes
объект, то это `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")`, который даетb'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Не публикация в качестве ответа, так как вопрос запрашивает байтовый массив, но публикация здесь, поскольку это первый хит, который я получил при поиске шестнадцатеричных байтов.hex_string.decode("hex")
работает на Python 2.7. Я только что проверил на своемPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.bytes.fromhex
выдает ошибку, когда входная строка имеет нечетное количество символов:bytes.fromhex("aab")
→ValueError: non-hexadecimal number found in fromhex() arg at position 3
.В bytearray есть встроенная функция, которая делает то, что вы собираетесь.
Он возвращает байтовый массив и читает шестнадцатеричные строки с разделителем пробелов или без него.
источник
hex_string.decode("hex")
нет.при условии, что я правильно понял, вы должны искать binascii.unhexlify
источник
unhexlify
это самый эффективный способ, но я бы сказал, чтоb = bytearray(s)
это будет лучше, чем использоватьord
. Поскольку у Python есть встроенный тип только для массивов байтов, я удивлен, что никто не использует егоПредполагая, что у вас есть строка байтов, как это
"\ X12 \ x45 \ x00 \ XAB"
и вы знаете количество байтов и их тип, вы также можете использовать этот подход
Как я указал в начале строки формата little endian (используя символ '<'), функция вернула десятичный эквивалент.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B равен одному байту (8 бит) без знака
H равен двум байтам (16 бит) без знака
Более доступные символы и размеры байтов можно найти здесь
Преимущества ..
Вы можете указать более одного байта и порядковый номер значений
Недостатки ..
Вам действительно нужно знать тип и длину данных, с которыми вы имеете дело
источник
Вы должны быть в состоянии построить строку, содержащую двоичные данные, используя что-то вроде:
Это, вероятно, не самый быстрый способ (многие строки добавляются), но довольно простой, используя только основной Python.
источник
Вы можете использовать модуль кодеков в стандартной библиотеке Python, т.е.
источник
источник
Хороший лайнер это:
Это будет перебирать каждый символ в строке и запускать его через функцию ord (). Только проверено на Python 2.6, не слишком уверен насчет 3.0+.
-Josh
источник
byte_list = bytearray(hex_string)