Відповіді:
Припустимо, ваш шістнадцятковий рядок щось подібне
>>> hex_string = "deadbeef"
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
>>> bytes.fromhex(hex_string) # Python ≥ 3
b'\xde\xad\xbe\xef'
>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
Зауважте, що bytes
це незмінна версія bytearray
.
string
-> bytes
об'єкт, це `bytes.fromhex (« 000102030405060708090A0B0C0D0E0F »)` , який дає b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Не публікація як відповідь, оскільки питання задає байтовий масив, але публікує тут, оскільки це перше звернення, яке я отримав під час пошуку hext до байтів.
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.fromhex("de ad be ef 00")
Він повертає байт-масив і читає шістнадцяткові рядки з роздільником пробілу або без нього.
hex_string.decode("hex")
ні.
за умови, що я правильно зрозумів, вам слід шукати binascii.unhexlify
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
unhexlify
це найефективніший спосіб поїхати сюди, але я б припустив, що це b = bytearray(s)
було б краще, ніж використання ord
. Оскільки в Python є вбудований тип лише для масивів байтів, я здивований, що його ніхто не використовує
Припустимо, що у вас є такий рядок байтів
"\ x12 \ x45 \ x00 \ xAB"
і ви знаєте кількість байтів та їх тип, ви також можете використовувати цей підхід
import struct
bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)
#val = (18, 69, 43776)
Як я вказав маленький ендіан (використовуючи знак <<) на початку рядка формату, функція повертала десятковий еквівалент.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B дорівнює одному байту (8 біт) без підпису
H дорівнює двома байтами (16 біт) без підпису
Більше доступних символів та розмірів байтів можна знайти тут
Переваги:
Ви можете вказати більше одного байта і значення ендіана значень
Недоліки ..
Вам дійсно потрібно знати тип і довжину даних, з якими ви маєте справу
Ви повинні мати можливість створити рядок, що містить бінарні дані, використовуючи щось на зразок:
data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
bits += chr(int(data[x:x+2], 16))
Це, мабуть, не найшвидший спосіб (додається багато рядків), але досить простий, використовуючи лише ядро Python.
Можна використовувати модуль Codecs у стандартній бібліотеці Python, тобто
import codecs
codecs.decode(hexstring, 'hex_codec')
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+.
-Джош
byte_list = bytearray(hex_string)