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的主要内容,如果未能解决你的问题,请参考以下文章

复制时跳过 x 字节的 memcpy 等效项(不仅仅是初始 x 字节)?

字符串与编码,字符与数字相转函数:ord(), chr()

在 Rails 中将文件大小字符串转换为等效千字节

生成随机中文

匿名函数和内置方法

php随机生成汉字