Преобразование списка строк байтов в массив байтов (поток байтов)

У меня есть список шестнадцатеричных строк, представляющих байты, в форме «FF». Я хочу преобразовать весь список в поток байтов, чтобы отправить его через сокет (Python 3). Похоже, что тип bytearray будет работать, но я не могу найти способ напрямую преобразовать список в bytearray.

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


person Lance Roberts    schedule 05.12.2011    source источник


Ответы (3)


hexstrings = ["DE", "AD", "BE", "EF"]   # big-endian 0xDEADBEEF

bytes = bytearray(int(x, 16) for x in hexstrings)
bytes = bytearray.fromhex("".join(hexstrings))     # Python 2.6 may need u""

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

person kindall    schedule 05.12.2011
comment
Комментарий к первому коду: 0xDEADBEEF — это целое число, относящееся к hexstrings только на машине с бигендерным порядком. Второй комментарий к коду: ваш код работает с python 2.7 без изменений; потребуется серьезная операция, чтобы заставить его работать на более ранних версиях, например. "".join([chr(int(x, 16)) for x in hexstrings]) будет выполнять работу для Python с 2.1 по 2.7 включительно. - person John Machin; 05.12.2011
comment
Первый комментарий был просто возможностью написать Ox Dead Beef в шестнадцатеричном формате, но технически вы правы — в лучшем случае правильно! А бычья мертвая говядина с прямым порядком байтов, возможно, еще смешнее. :-) Во-вторых, на самом деле Python 2.6 настаивал на том, чтобы там была строка Unicode, но это похоже на ошибку. 2.7 ведет себя так, как вы говорите, и я это изменил. (bytearray был введен в версии 2.6, просто для справки.) - person kindall; 05.12.2011

hexlist = ["a9", "00", "85", "c6"]
ba = bytearray(h.decode("hex") for h in hexlist)

См. также bytearray.fromhex:

bytearray.fromhex(string) -> bytearray

Создайте объект bytearray из строки шестнадцатеричных чисел. Допускаются пробелы между двумя числами. Пример: bytearray.fromhex('B9 01EF') -> bytearray(b'\xb9\x01\xef').

person MagerValp    schedule 05.12.2011

Ссылаться на :

char* PyByteArray_AsString(PyObject *bytearray) Возвращает содержимое bytearray в виде массива символов после проверки указателя NULL

из справочника по Python

person Sushant Khurana    schedule 05.12.2011
comment
Я ищу, чтобы пойти в другом направлении. - person Lance Roberts; 05.12.2011