chr()等效返回一个字节对象,在py3k中

时间:2010-12-24 00:37:29

标签: python unicode python-3.x

Python 2.x有chr(),它将0-255范围内的数字转换为一个字符串,其中一个字符具有该数字值,unichr()转换范围内的数字0-0x10FFFF到Unicode字符串,其中一个字符具有该Unicode代码点。 Python 3.x将unichr()替换为chr(),与其“Unicode字符串是默认值”策略保持一致,但我找不到任何与旧chr()完全相同的内容。 2to3实用程序(从2.6开始)单独留下chr个调用,这一般不正确:(

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

6 个答案:

答案 0 :(得分:32)

尝试以下方法:

b = bytes([x])

例如:

>>> bytes([255])
b'\xff'

答案 1 :(得分:12)

考虑使用在Python2和Python3中工作相同的bytearray((255,))。在两代Python中,生成的bytearray对象都可以转换为字节(obj),它是Python2中str()和Python3中实数字节()的别名。

# Python2
>>> x = bytearray((32,33))
>>> x
bytearray(b' !')
>>> bytes(x)
' !'

# Python3
>>> x = bytearray((32,33))
>>> x
bytearray(b' !')
>>> bytes(x)
b' !'

答案 2 :(得分:6)

如果您想编写Python 2/3兼容代码,请使用six.int2byte

答案 3 :(得分:5)

>>> import struct
>>> struct.pack('B', 10)
b'\n'
>>> import functools
>>> bchr = functools.partial(struct.pack, 'B')
>>> bchr(10)
b'\n'

答案 4 :(得分:3)

还有另一种选择(Python 3.5及更高版本):

>>> b'%c' % 65
b'A'

答案 5 :(得分:0)

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

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

binchr(1) -> b'\x01'