【问题标题】:chr() equivalent returning a bytes object, in py3kchr() 等效返回一个字节对象,在 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 位字节明确定义的文件格式。)

【问题讨论】:

    标签: python unicode python-3.x


    【解决方案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'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-04
          • 2011-02-25
          • 2014-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多