【问题标题】:Converting from hex to binary without losing leading 0's python从十六进制转换为二进制而不丢失前导0的python
【发布时间】:2011-03-16 13:24:51
【问题描述】:

我在像

这样的字符串中有一个十六进制值
h = '00112233aabbccddee'

我知道我可以使用以下方法将其转换为二进制:

h = bin(int(h, 16))[2:]

但是,这会丢失前导 0。有没有办法在不丢失 0 的情况下进行这种转换?或者最好的方法是在转换之前计算前导 0 的数量,然后在之后添加它。

【问题讨论】:

  • 您需要0's 有什么特别的原因吗?
  • 我稍后使用值 h 作为字典的键。然而,该键具有所有前导 0。
  • 您使用二进制字符串表示值而不是整数作为字典键是否有令人信服的理由?
  • @WayneWerner:我一直在寻找这个,所以我可以轻松地比较 50 个二进制数并寻找没有变化的位。 [bin(x).rjust(20) for x in a] 已经足够好了。

标签: python binary hex


【解决方案1】:

我认为没有办法默认保留这些前导零。

每个十六进制数字转换为 4 个二进制数字,因此新字符串的长度应该是原始字符串大小的 4 倍。

h_size = len(h) * 4

然后,您可以使用.zfill 将零填充到您想要的大小:

h = ( bin(int(h, 16))[2:] ).zfill(h_size)

【讨论】:

  • 我认为由于某种原因这给了我 3 个额外的 0
  • 啊,没关系,它可以完美运行。我没有计算第一个非零十六进制数字之前的 0。谢谢。
  • @root: 无关:不要将h 名称用于不同的事物,例如,使用bits 名称作为结果:bits = bin(int(h, 16))[2:].zfill(len(h) * 4)
【解决方案2】:

这在 Python 中实际上很简单,因为它对整数的大小没有任何限制。只需将 '1' 添加到十六进制字符串,然后从输出中删除相应的 '1'

>>> h = '00112233aabbccddee'
>>> bin(int(h, 16))[2:]  # old way
'1000100100010001100111010101010111011110011001101110111101110'
>>> bin(int('1'+h, 16))[3:]  # new way
'000000000001000100100010001100111010101010111011110011001101110111101110'

【讨论】:

  • 找了一个小时!
  • 为什么这不是一个被接受的答案。
  • @foobar 您会注意到它是在接受答案 3 年后发布的 - 不记得是什么促使我做出回答。
【解决方案3】:

基本相同,但每个 hexdigit 填充到 4 个二进制位

''.join(bin(int(c, 16))[2:].zfill(4) for c in h)

【讨论】:

    【解决方案4】:

    像我这样的python新手,我会这样做

    datastring = 'HexInFormOfString'  
    

    当 python 将字符串转换为十六进制时,填充以容纳前面的零(如果有)。

    datastrPadded = 'ffff' + datastring 
    

    将填充值转换为二进制。

    databin = bin(int(datastrPadded,16))
    

    删除python添加的2位('0b')以表示二进制+ 16填充位。

    databinCrop = databin[18:]
    

    【讨论】:

      【解决方案5】:

      这会将十六进制字符串转换为二进制字符串。由于您希望长度取决于原件,因此这可能就是您想要的。

      data = ""
      while len(h) > 0:
          data = data + chr(int(h[0:2], 16))
          h = h[2:]
      print h
      

      【讨论】:

        【解决方案6】:

        我需要整数作为输入,并且需要带有前缀“0b”和“0x”的纯十六进制/二进制字符串,所以我的一般解决方案是:

        def pure_bin(data, no_of_bits=NO_OF_BITS):
            data = data + 2**(no_of_bits)
            return bin(data)[3:]
        
        def pure_hex(data, no_of_bits=NO_OF_BITS):
            if (no_of_bits%4) != 0:
                no_of_bits = 4*int(no_of_bits / 4) + 4
            data = data + 2**(no_of_bits)
            return hex(data)[3:]
        

        【讨论】:

          【解决方案7】:
          hexa = '91278c4bfb3cbb95ffddc668d995bfe0'
          binary = bin(int(hexa, 16))[2:]
          print binary
          hexa_dec = hex(int(binary, 2))[2:]
          print hexa_dec
          

          【讨论】:

            猜你喜欢
            • 2012-11-13
            • 2014-08-03
            • 2016-09-15
            • 1970-01-01
            • 2015-03-09
            • 2015-11-18
            • 2016-06-05
            相关资源
            最近更新 更多