【问题标题】:xor with leading zero issue in pythonxor 与 python 中的前导零问题
【发布时间】:2015-01-25 03:28:50
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 试试"0x{:02x}".format(int('45', 16) ^ int('4e', 16))

标签: python string hex bit xor


【解决方案1】:

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

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

【讨论】:

  • 谢谢。简单有效。
【解决方案2】:

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

>>> 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'
>>>

【讨论】:

    【解决方案3】:

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

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

    证明:

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

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

    解决方案是把你的算术做清楚,直到最后然后选择你希望如何呈现结果。

    你的计算结果是11:

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

    然后格式化。

    老办法:

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

    新方法:

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

    或者:

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

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多