在 python 中具有前导零问题的异或

xor with leading zero issue in python

我想对 python 中的两个十六进制格式字符串进行异或运算,例如“45”和“4e”。但是,如果结果在 [0x00, 0x0f] 中,我如何保持前导零?

hex(int('45', 16) ^ int('4e', 16))

给出“0xb”,而我期待“0x0b”。

提前致谢。

最简单的方法是使用str.format():

>>> '0x{:02x}'.format(0xb)
'0x0b'

这里的问题是您对函数 hex 的期望。

hex() 只为输出生成一个字符串表示。

证明:

>>> hex(2)+hex(15)
'0x20xf'          

这当然是胡说八道,因为 hex(2) 的字符串值和 hex(15) 的字符串值只是附加在一起。

解决方案是将算术计算清楚,然后 select 您希望如何呈现结果。

你的计算结果是 11:

>>> int('45', 16) ^ int('4e', 16)
11

然后格式化。

旧方法:

>>> '0x%0.2x' % 11
'0x0b'

更新的方式:

>>> '0x'+format(11,'02x')
'0x0b'

或者:

>>> '0x{:02x}'.format(11)
'0x0b'

对于相对较少的值(如 0x00-0xff),一种实用且非常有效的方法可以按照您希望的方式将结果转换为十六进制字符串,即构建并使用查找表 table.构建 table 时使用的 '0x%02x' % v 表达式也是一种仅转换单个值一次的简单且相当简洁的方法。

>>> HEXDEC = ['0x%02x' % v for v in (x+y for x in range(16) for y in range(16))]
>>> HEXDEC[int('45', 16) ^ int('4e', 16)]
'0x0b'
>>>