chr() 等效返回一个字节对象,在 py3k
Posted
技术标签:
【中文标题】chr() 等效返回一个字节对象,在 py3k【英文标题】:chr() equivalent returning a bytes object, in py3k 【发布时间】:2011-05-30 05:44:43 【问题描述】:Python 2.x 有 chr()
,它将 0-255 范围内的数字转换为具有该数值的一个字符的字节字符串,以及 unichr()
,它将 0-0x10FFFF 范围内的数字转换为一个 Unicode 字符串,其中一个字符具有该 Unicode 代码点。 Python 3.x 将unichr()
替换为chr()
,以符合其“Unicode 字符串为默认”策略,但我找不到任何与旧chr()
完全相同的东西。 2to3
实用程序(从 2.6 开始)只留下 chr
调用,这通常是不对的 :(
(用于解析和序列化以 8 位字节明确定义的文件格式。)
【问题讨论】:
【参考方案1】:尝试以下方法:
b = bytes([x])
例如:
>>> bytes([255])
b'\xff'
【讨论】:
我对乱扔临时数组有点紧张,但我可能不应该这样做。无论如何,它完成了这项工作。 @Zack:您可以使用bytes((255, ))
作为变体。
bytes((255,)) 在 Python2 中不会给你 b'\xff' ...它会返回 '(255,)' 。
@GuidoDraheim2013:它是 Python 3 代码,即,不要在 Python 2 上使用 bytes([255])
,在此处使用 chr(255)
。
@malthe: bytes((255, ))
仍在创建一个临时数组。【参考方案2】:
考虑使用 bytearray((255,)),它在 Python2 和 Python3 中的工作方式相同。在两代 Python 中,生成的 bytearray-object 都可以转换为 bytes(obj),它是 Python2 中 str() 和 Python3 中 real bytes() 的别名。
# Python2
>>> x = bytearray((32,33))
>>> x
bytearray(b' !')
>>> bytes(x)
' !'
# Python3
>>> x = bytearray((32,33))
>>> x
bytearray(b' !')
>>> bytes(x)
b' !'
【讨论】:
【参考方案3】:如果您想编写兼容 Python 2/3 的代码,请使用 six.int2byte
【讨论】:
我不明白为什么这会比 Guido 的回答更好,特别是如果我没有其他需要six
。
@zwol:对于 Python 3.2+,int2byte = operator.methodcaller("to_bytes", 1, "big")
。根据评论,这比bytes((...))
快大约 2 倍。不管怎样,int2byte(x)
对我来说看起来比 bytes(bytearray((x,)))
好。
速度很好,但在引发原始问题的事情中,在标准库之外没有依赖项是最重要的问题。
bytes
直接将tuple
用作构造函数,因此您可以只使用bytes((x,))
。如果你希望它是可变的,只需要使用bytearray
。【参考方案4】:
>>> import struct
>>> struct.pack('B', 10)
b'\n'
>>> import functools
>>> bchr = functools.partial(struct.pack, 'B')
>>> bchr(10)
b'\n'
【讨论】:
【参考方案5】:另一种选择(Python 3.5+):
>>> b'%c' % 65
b'A'
【讨论】:
很烦b':c'.format(65)
不能很好地工作,但是谢谢,这对于我最初想要的东西来说可能非常方便(并且从来没有完成)。【参考方案6】:
基于小范围记忆的简单替换(应该适用于 2 和 3),在 CPython 和 pypy 上表现良好
binchr = tuple([bytes(bytearray((b,))) for b in range(256)]).__getitem__
binchr(1) -> b'\x01'
【讨论】:
以上是关于chr() 等效返回一个字节对象,在 py3k的主要内容,如果未能解决你的问题,请参考以下文章