我有一个整数ascii值列表,我需要将其转换为字符串(二进制)以用作加密操作的密钥。 (我在python中重新实现java加密代码)
这有效(假设一个8字节的密钥):
key = struct.pack('BBBBBBBB', 17, 24, 121, 1, 12, 222, 34, 76)
但是,我更希望没有密钥长度和unpack()参数列表硬编码。
在给定初始的整数列表的情况下,如何正确实现这一点?
谢谢!
答案 0 :(得分:55)
对于Python 2.6及更高版本,如果处理字节,那么bytearray
是最明显的选择:
>>> str(bytearray([17, 24, 121, 1, 12, 222, 34, 76]))
'\x11\x18y\x01\x0c\xde"L'
对我而言,这比Alex Martelli的答案更直接 - 仍然没有字符串操作或len
电话,但现在你甚至不需要输入任何内容!
答案 1 :(得分:45)
对于这类任务(涉及同类值序列的任务),我更喜欢array
模块到struct
模块:
>>> import array
>>> array.array('B', [17, 24, 121, 1, 12, 222, 34, 76]).tostring()
'\x11\x18y\x01\x0c\xde"L'
没有len
调用,不需要字符串操作等 - 快速,简单,直接,为什么更喜欢任何其他方法?!
答案 2 :(得分:31)
这是一个旧问题,但在Python 3中,你可以直接使用bytes
:
>>> bytes([17, 24, 121, 1, 12, 222, 34, 76])
b'\x11\x18y\x01\x0c\xde"L'
答案 3 :(得分:11)
struct.pack('B' * len(integers), *integers)
*sequence
表示“解包序列” - 或者更确切地说,“在致电f(..., *args ,...)
时,请args = sequence
”。
答案 4 :(得分:7)
key = "".join( chr( val ) for val in myList )
答案 5 :(得分:1)
以前使用map()
函数的较短版本(适用于python 2.7):
"".join(map(chr, myList))
答案 6 :(得分:0)
另一种方法(Python 2.7 +):
"".join(str(x) for x in int_array)