Список целых чисел в строку (массив байтов) - 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))