我有一个整数ASCII值列表,需要将其转换为字符串(二进制),以用作密码操作的密钥。(我正在使用Python重新实现Java加密代码)
这个方法可以工作(假设是8字节密钥):
key = struct.pack('BBBBBBBB', 17, 24, 121, 1, 12, 222, 34, 76)
然而,我希望键长和unpack()参数列表不是硬编码的。
如果有一个初始的整数列表,我应该如何正确实现它呢?
谢谢!
我有一个整数ASCII值列表,需要将其转换为字符串(二进制),以用作密码操作的密钥。(我正在使用Python重新实现Java加密代码)
这个方法可以工作(假设是8字节密钥):
key = struct.pack('BBBBBBBB', 17, 24, 121, 1, 12, 222, 34, 76)
然而,我希望键长和unpack()参数列表不是硬编码的。
如果有一个初始的整数列表,我应该如何正确实现它呢?
谢谢!
对于 Python 2.6 及以上版本,如果您处理的是字节,则 bytearray
是最明显的选择:
>>> str(bytearray([17, 24, 121, 1, 12, 222, 34, 76]))
'\x11\x18y\x01\x0c\xde"L'
对我而言,这比Alex Martelli的回答还要更直接 - 仍然不需要字符串操作或len
调用,但现在甚至不需要导入任何东西!- Cees Timmermanimport sys; sys.version '3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Intel)]'`
对于涉及到同类型值的序列操作,我更喜欢使用array
模块而不是struct
模块:
>>> import array
>>> array.array('B', [17, 24, 121, 1, 12, 222, 34, 76]).tostring()
'\x11\x18y\x01\x0c\xde"L'
不需要 len
调用,不需要字符串操作等 —— 快速、简单、直接,为什么要选择其他方法?!
tostring()
已被弃用。请使用 tobytes()
方法代替,这是更清晰的名称并且可以完成相同的功能。 - TylerH这是在重新讨论一个旧问题,但在Python 3中,您可以直接使用bytes
:
>>> bytes([17, 24, 121, 1, 12, 222, 34, 76])
b'\x11\x18y\x01\x0c\xde"L'
struct.pack('B' * len(integers), *integers)
*sequence
表示“解包序列” - 或者更确切地说,“在调用 f(..., *args ,...)
时,让 args = sequence
”。
'%dB'%len(integers)
或者甚至是'{}B'.format(len(integers))
。 - Sergio Ivanuzzokey = "".join( chr( val ) for val in myList )
使用map()
函数的简短版本(适用于Python 2.7):
"".join(map(chr, myList))
222
不是 ASCII 值。这是一个打字错误,还是你的字节实际上是来自某个基于 ASCII 的国家代码页的字符? - cubuspl42