【问题标题】:Convert list of ASCII codes to string (byte array) in Python在 Python 中将 ASCII 代码列表转换为字符串(字节数组)
【发布时间】:2010-08-12 17:32:53
【问题描述】:

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

这可行(假设一个 8 字节的密钥):

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

但是,我希望不对密钥长度和 unpack() 参数列表进行硬编码。

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

谢谢!

【问题讨论】:

  • 为什么需要一个“二进制”字符串?
  • 222 不是 ASCII 值。是拼写错误,还是您的字节实际上是某些基于 ASCII 的国家代码页中的字符?

标签: python


【解决方案1】:

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

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

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

【讨论】:

  • 对于那些想知道的人来说,Alex Martelli 的答案似乎运行得更快,至少在我的 Python 2.7.7 基准测试中是这样。对于 10,000 次运行,他的答案是 12 毫秒,而这个答案是 18 毫秒;这些数字是可重复的,几乎没有变化。当然,这并不是一个巨大的收益,只是在处理大量数据时。也就是说,这个答案对我来说实际上在 8 毫秒时更快:stackoverflow.com/a/12073686/353094
  • @leetNightshade 在 Python 3.4.1 x86 中说,根据我的基准测试,这种方法是最快的。
  • >>> str(bytearray([42])) "bytearray(b'*')" >>> import sys; sys.version '3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Intel)]'
【解决方案2】:

我更喜欢 array 模块而不是 struct 模块来处理这类任务(涉及同质值序列的任务):

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

无需len 调用,无需字符串操作等——快速、简单、直接,为什么更喜欢任何其他方法?!

【讨论】:

  • 从逻辑上讲,这对我来说是最有意义的。感谢您的提示!
  • 方法 tostring() 自 python 3.2 起现已弃用。改为调用tobytes(),这对于实际发生的事情来说是一个更清晰的名称。
【解决方案3】:

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

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

【讨论】:

  • 优秀、干净、简单!
  • 这可能是python3的“最正确”答案
  • 如何反其道而行之? (字节 -> 数组)
  • @Tino:要列出的字节数,你的意思是?你可以简单地使用 list(): list(b'spam') → [115, 112, 97, 109]
【解决方案4】:
struct.pack('B' * len(integers), *integers)

*sequence 表示“解包序列”——或者更确切地说,“当调用f(..., *args ,...) 时,让args = sequence”。

【讨论】:

  • 有趣;我应该意识到我可以在字符串上使用乘法,但我不知道“解包序列”。谢谢!
  • 很好的解决方案,也可以使用'%dB' % len(integers)甚至'{}B'.format(len(integers))
【解决方案5】:
key = "".join( chr( val ) for val in myList )

【讨论】:

    【解决方案6】:

    以前使用map() 函数的更短版本(适用于python 2.7):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多