整数列表到字符串(字节数组) - python

mik*_*ers 39 python

我有一个整数ascii值列表,我需要将其转换为字符串(二进制)以用作加密操作的键.(我在python中重新实现java加密代码)

这有效(假设一个8字节的密钥):

key = struct.pack('BBBBBBBB', 17, 24, 121, 1, 12, 222, 34, 76)
Run Code Online (Sandbox Code Playgroud)

但是,我宁愿没有密钥长度和硬盘编码的unpack()参数列表.

在给定初始的整数列表的情况下,如何正确实现?

谢谢!

Sco*_*ths 56

对于Python 2.6及更高版本,如果您处理字节,则a bytearray是最明显的选择:

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

对我来说,这比Alex Martelli的回答更直接 - 仍然没有字符串操作或len调用,但现在你甚至不需要导入任何东西!

  • 对于那些想知道的人,Alex Martelli的答案似乎运行得更快,至少我的Python 2.7.7中的基准测试.对于10000次运行,他的答案为12ms,而对于18ms; 这些数字是可重复的,几乎没有变化.当然,处理大量数据时,这并不是一个巨大的收获.也就是说,这个答案在8ms时实际上对我来说更快:http://stackoverflow.com/a/12073686/353094 (3认同)
  • @leetNightshade那说在Python 3.4.1 x86中根据我的基准测试,这种方法是最快的. (3认同)

Ale*_*lli 46

对于这类任务,我更喜欢array模块到struct模块(涉及齐次值序列的模块):

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

没有len电话,不需要字符串操作等 - 快速,简单,直接,为什么更喜欢任何其他方法?!

  • 从python 3.2开始不推荐使用`tostring()`方法。而是调用“ tobytes()”,它是实际发生的事情的更清晰的名称。 (3认同)
  • 从逻辑上讲,这对我来说最有意义.谢谢你的提示! (2认同)

Pi *_*ort 38

这是一个老问题,但在Python 3中,您可以直接使用bytes:

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


小智 11

struct.pack('B' * len(integers), *integers)
Run Code Online (Sandbox Code Playgroud)

*sequence意思是"解包顺序" - 或者更确切地说,"当打电话时f(..., *args ,...),让args = sequence".


Kat*_*iel 7

key = "".join( chr( val ) for val in myList )
Run Code Online (Sandbox Code Playgroud)