如何在Python中将0x1b87打印为\ x1b\x87?

Sam*_*rts 2 python hex

我怎样才能0x1b87\x1b\x87Python 一样打印?

$ 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'
Run Code Online (Sandbox Code Playgroud)

vau*_*tah 6

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

Python 2

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

>>> format(0x0d90 ^ 0x1617, 'x').decode('hex')
'\x1b\x87'
Run Code Online (Sandbox Code Playgroud)

或打包整数struct.pack(>对于big-endian顺序,Hfor unsigned short- 更改格式字符以满足您的要求)

>>> import struct
>>> struct.pack('>H', 0x0d90 ^ 0x1617)
'\x1b\x87'
Run Code Online (Sandbox Code Playgroud)

Python 3

bytes.fromhex 这样做:

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

struct.pack仍然是一个选项,格式字符串与Python 2一样(参见上一节):

In [2]: import struct

In [3]: struct.pack('>H', 0x0d90 ^ 0x1617)
Out[3]: b'\x1b\x87'
Run Code Online (Sandbox Code Playgroud)

hex现在的编解码器是一个二进制转换,使用codecs.decode:

In [4]: import codecs

In [5]: codecs.decode(format(0x0d90 ^ 0x1617, 'x'), 'hex')
Out[5]: b'\x1b\x87'
Run Code Online (Sandbox Code Playgroud)

Python 3.2和更新版本

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

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

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

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

In [22]: i = 0x0d90 ^ 0x1617

In [23]: i.to_bytes((i.bit_length() // 8) + 1, 'big')
Out[23]: b'\x1b\x87'
Run Code Online (Sandbox Code Playgroud)

另外,请考虑指定signed参数

确定是否使用二进制补码来表示整数.如果signedFalse且给出了负整数,则引发OverflowError.