Список целых чисел в строку (массив байтов) - python

У меня есть список целочисленных значений ascii, которые мне нужно преобразовать в строку (двоичную), чтобы использовать ее в качестве ключа для операции криптографии. (Я перепрограммирую Java-скриптовый код в python)

Это работает (при условии 8-байтового ключа):

key = struct.pack('BBBBBBBB', 17, 24, 121, 1, 12, 222, 34, 76)

Тем не менее, я бы предпочел, чтобы список ключей и список параметров unpack() не были жестко закодированы.

Как я могу реализовать это правильно, учитывая начальный список целых чисел?

Спасибо!

Ответ 1

Я предпочитаю модуль array для модуля struct для таких задач (связанных с последовательностями однородных значений):

>>> import array
>>> array.array('B', [17, 24, 121, 1, 12, 222, 34, 76]).tostring()
'\x11\x18y\x01\x0c\xde"L'

no len вызов, никаких манипуляций с строкой и т.д. - быстрый, простой, прямой, почему предпочитаете какой-либо другой подход?!

Ответ 2

Для Python 2.6 и более поздних, если вы имеете дело с байтами, тогда bytearray является наиболее очевидным выбором:

>>> str(bytearray([17, 24, 121, 1, 12, 222, 34, 76]))
'\x11\x18y\x01\x0c\xde"L'

Для меня это еще более прямо, чем ответ Alex Martelli - до сих пор нет строковых манипуляций или len, но теперь вам даже не нужно ничего импортировать!

Ответ 3

Это возрождает старый вопрос, но в Python 3 вы можете просто использовать bytes напрямую:

>>> bytes([17, 24, 121, 1, 12, 222, 34, 76])
b'\x11\x18y\x01\x0c\xde"L'

Ответ 4

struct.pack('B' * len(integers), *integers)

*sequence означает "распаковать последовательность" - или, скорее, "при вызове f(..., *args ,...), args = sequence".

Ответ 5

key = "".join( chr( val ) for val in myList )

Ответ 6

Более короткая версия предыдущей функции map() (работает для python 2.7):

"".join(map(chr, myList))