我怎样才能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)
我将format(..., 'x')用于十六进制表示,避免不必要的切片(hex(...)[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)
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引入了很酷的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参数
确定是否使用二进制补码来表示整数.如果signed为False且给出了负整数,则引发OverflowError.
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |