шестнадцатеричная строка в массив байтов в python


У меня есть длинная шестнадцатеричная строка, которая представляет собой ряд значений разных типов. Я хочу преобразовать эту шестнадцатеричную строку в массив байтов, чтобы я мог переместить каждое значение и преобразовать его в свой собственный тип данных.

8 101

8 ответов:

предположим, что ваша шестнадцатеричная строка - это что-то вроде

>>> hex_string = "deadbeef"

преобразовать его в строку (Python ≤ 2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

или начиная с Python 2.7 и Python 3.0:

>>> bytes.fromhex(hex_string)  # Python ≥ 3
b'\xde\xad\xbe\xef'

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

отметим, что bytes является неизменяемой версией bytearray.

в bytearray есть встроенная функция, которая делает то, что вы намереваетесь.

bytearray.fromhex("de ad be ef 00")

он возвращает bytearray и считывает шестнадцатеричные строки с разделителем пробелов или без него.

если я правильно понял, вы должны искать binascii.unhexlify

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]

вы должны быть в состоянии построить строку, содержащую двоичные данные, используя что-то вроде:

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

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

предполагая, что у вас есть байтовая строка типа so

"\x12\x45\x00\xAB"

и вы знаете количество байтов и их тип вы также можете использовать этот подход

import struct

bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)

#val = (18, 69, 43776)

Как я указал little endian (используя '

0x12 = 18

0x45 = 69

0xAB00 = 43776

B равно одному байту (8 бит) неподписанные

H равно двум байтам (16 бит) без знака

более доступные символы и размеры байтов можно найти здесь

преимущества..

вы можете указать более одного байта и endian значений

недостатки..

вам действительно нужно знать тип и длину данных, с которыми вы имеете дело

def hex2bin(s):
    hex_table = ['0000', '0001', '0010', '0011',
                 '0100', '0101', '0110', '0111',
                 '1000', '1001', '1010', '1011',
                 '1100', '1101', '1110', '1111']
    bits = ''
    for i in range(len(s)):
        bits += hex_table[int(s[i], base=16)]
    return bits

хороший лайнер:

byte_list = map(ord, hex_string)

это будет перебирать каждый символ в строке и запускать его через функцию ord (). Только проверенные на Python 2.6, не слишком уверен в 3.0+.

-Джош

для использования обратного преобразования binascii.b2a_hex (obj)