我将使用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 参数
判断是否补码
用于表示整数。如果 signed 是 False 并且是否定的
给出整数,引发 OverflowError。