Python 返回字节对象的chr()等价物,单位为py3k

Python 返回字节对象的chr()等价物,单位为py3k,python,unicode,python-3.x,Python,Unicode,Python 3.x,Python2.x有chr(),它将0-255范围内的数字转换为一个带有该数值的一个字符的字节字符串,还有unichr(),它将0-0x10FFFF范围内的数字转换为带有该Unicode码点的一个字符的Unicode字符串。Python3.x将unichr()替换为chr(),以符合其“Unicode字符串为默认值”的策略,但我找不到与旧的chr()完全相同的内容。2to3实用程序(从2.6开始)只剩下chr调用,这通常是不正确的:( (用于解析和序列化以8位字节明确定义的文件格式。)请尝试以下

Python2.x有
chr()
,它将0-255范围内的数字转换为一个带有该数值的一个字符的字节字符串,还有
unichr()
,它将0-0x10FFFF范围内的数字转换为带有该Unicode码点的一个字符的Unicode字符串。Python3.x将
unichr()
替换为
chr()
,以符合其“Unicode字符串为默认值”的策略,但我找不到与旧的
chr()
完全相同的内容。
2to3
实用程序(从2.6开始)只剩下
chr
调用,这通常是不正确的:(

(用于解析和序列化以8位字节明确定义的文件格式。)

请尝试以下操作:

b = bytes([x])
例如:

>>> bytes([255])
b'\xff'
考虑使用bytearray((255,)),它在Python2和Python3中的作用相同。在两代Python中,生成的bytearray对象可以转换为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' !'

如果您想编写与Python 2/3兼容的代码,请使用另一种替代方法(Python 3.5+):


基于小范围记忆的简单替换(应适用于2和3),在CPython和pypy上性能良好

binchr = tuple([bytes(bytearray((b,))) for b in range(256)]).__getitem__

binchr(1) -> b'\x01'

我对使用scratch数组感到有点不安,但可能我不应该这样做。反正它能完成任务。@Zack:你可以使用
bytes((255,)
作为变体。Python2中的bytes((255,))不会给你b'\xff'…它会返回“(255,)。@Guidoraheim2013:这是Python 3代码,也就是说,不要使用
bytes([255])
在Python2上,使用
chr(255)
那里。@malthe:
bytes((255,)
仍然在创建一个临时数组。我不明白为什么这会比Guido的答案更好,特别是如果我不需要
six
@zwol:Python3.2+,
int2byte=operator.methodcaller(“to_bytes”,1,“big”)
。根据评论,这比
字节((…)
快约2倍。无论如何,
int2byte(x)
看起来比
字节(bytearray((x,))好)
对我来说,速度是好的,但在引发最初问题的事情中,标准库之外没有依赖关系是一个压倒一切的问题。
bytes
直接使用
tuple
作为构造函数,所以您可以只使用
bytes((x,))
。如果您希望它是可变的,只需要使用
bytearray
。讨厌的是
b'{:c}。格式(65)
也不起作用,但是谢谢,这对于我最初想要的东西来说是非常方便的(而且从来没有时间完成)。
>>> b'%c' % 65
b'A'
binchr = tuple([bytes(bytearray((b,))) for b in range(256)]).__getitem__

binchr(1) -> b'\x01'