шестнадцатеричная строка в массив байтов в python
У меня есть длинная шестнадцатеричная строка, которая представляет собой ряд значений разных типов. Я хочу преобразовать эту шестнадцатеричную строку в массив байтов, чтобы я мог переместить каждое значение и преобразовать его в свой собственный тип данных.
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