【问题标题】:How can I get 0x1b87 to print like \x1b\x87 in Python?如何让 0x1b87 在 Python 中像 \x1b\x87 一样打印?
【发布时间】:2015-08-26 19:05:10
【问题描述】:

如何让0x1b87 在 Python 中像 \x1b\x87 一样打印?

$ python
Python 2.7.9 (default, Apr  2 2015, 15:33:21) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> hex(0x0d90 ^ 0x1617)
'0x1b87'

【问题讨论】:

    标签: python hex


    【解决方案1】:

    我将使用format(..., 'x') 进行十六进制表示,避免不必要的切片 (hex(...)[2:])。

    Python 2

    只需解码字符串(使用hex 编解码器):

    >>> format(0x0d90 ^ 0x1617, 'x').decode('hex')
    '\x1b\x87'
    

    或使用struct.pack 打包整数(> 用于大端顺序,H 用于unsigned short - 更改format character 以满足您的要求)

    >>> import struct
    >>> struct.pack('>H', 0x0d90 ^ 0x1617)
    '\x1b\x87'
    

    Python 3

    bytes.fromhex 这样做:

    In [1]: bytes.fromhex(format(0x0d90 ^ 0x1617, 'x'))
    Out[1]: b'\x1b\x87'
    

    struct.pack 仍然是一个选项,format strings 与 Python 2 一样(参见上一节):

    In [2]: import struct
    
    In [3]: struct.pack('>H', 0x0d90 ^ 0x1617)
    Out[3]: b'\x1b\x87'
    

    hex 编解码器现在是binary transforms 之一,使用codecs.decode

    In [4]: import codecs
    
    In [5]: codecs.decode(format(0x0d90 ^ 0x1617, 'x'), 'hex')
    Out[5]: b'\x1b\x87'
    

    Python 3.2 及更新版本

    Python 3.2 引入了很酷的int.to_bytes 方法:

    In [4]: (0x0d90 ^ 0x1617).to_bytes(4, 'big')
    Out[4]: b'\x00\x00\x1b\x87'
    

    它将产生固定数量的字节(在本例中为4)或OverflowError“如果整数不能用给定的字节数表示”。

    有一种方法可以计算表示整数所需的最小字节数:

    In [22]: i = 0x0d90 ^ 0x1617
    
    In [23]: i.to_bytes((i.bit_length() // 8) + 1, 'big')
    Out[23]: b'\x1b\x87'
    

    另外,考虑指定signed 参数

    判断是否补码 用于表示整数。如果 signedFalse 并且是否定的 给出整数,引发 OverflowError

    【讨论】:

      【解决方案2】:
      import struct
      struct.pack(">H" ,int('0x1b87',16))
      
      '\x1b\x87'
      >>>
      

      【讨论】:

        猜你喜欢
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        相关资源
        最近更新 更多