【问题标题】:Python conversion from binary string to hexadecimalPython从二进制字符串转换为十六进制
【发布时间】:2023-03-04 23:00:02
【问题描述】:

如何在 Python 中将二进制字符串转换为对应的十六进制值?

我有 0000 0100 1000 1101,我想获得 048D 我正在使用 Python 2.6。

【问题讨论】:

    标签: python binary hex


    【解决方案1】:

    我愿意:

    dec_str = format(int('0000010010001101', 2),'x')
    dec_str.rjust(4,'0')
    

    结果:'048d'

    【讨论】:

      【解决方案2】:

      要将二进制字符串转换为十六进制字符串,我们不需要任何外部库。使用格式化的字符串文字(称为 f 字符串)。此功能是在 python 3.6 (PEP 498) 中添加的

      >>> bs = '0000010010001101'
      >>> hexs = f'{int(bs, 2):X}'
      >>> print(hexs)
      >>> '48D'
      

      如果你想要小写的十六进制字符串,请使用小“x”,如下所示

      f'{int(bs, 2):x}'
      

      其中 f-string 中的 bs 是一个变量,其中包含预先分配的二进制字符串

      f-strings 丢失更有用和有效。它们没有被充分发挥潜力。

      【讨论】:

        【解决方案3】:
         x = int(input("press 1 for dec to oct,bin,hex \n press 2 for bin to dec,hex,oct \n press 3 for oct to bin,hex,dec \n press 4 for hex to bin,dec,oct \n"))
        
        
           if x is 1:
        
          decimal =int(input('Enter the decimal number: '))
        
          print(bin(decimal),"in binary.")
         print(oct(decimal),"in octal.")
            print(hex(decimal),"in hexadecimal.")
        
              if x is 2:
        
               binary = input("Enter number in Binary Format: ");
        
          decimal = int(binary, 2);
          print(binary,"in Decimal =",decimal);
          print(binary,"in Hexadecimal =",hex(decimal));
          print(binary,"in octal =",oct(decimal));
        
            if x is 3:
        
              octal = input("Enter number in Octal Format: ");
        
              decimal = int(octal, 8);
              print(octal,"in Decimal =",decimal);
              print(octal,"in Hexadecimal =",hex(decimal));
              print(octal,"in Binary =",bin(decimal));
        
                  if x is 4:
        
                 hex = input("Enter number in hexa-decimal Format: ");
        
              decimal = int(hex, 16);
                print(hex,"in Decimal =",decimal);
              print(hex,"in octal =",oct(decimal));
                print(hex,"in Binary =",bin(decimal));
        

        【讨论】:

          【解决方案4】:

          int 给定底数 2 然后hex:

          >>> int('010110', 2)
          22
          >>> hex(int('010110', 2))
          '0x16'
          >>> 
          
          >>> hex(int('0000010010001101', 2))
          '0x48d'
          

          int的文档:

          int(x[, base]) -> integer
          
          Convert a string or number to an integer, if possible.  A floating
          

          点 参数将被截断为零(这不包括字符串 浮点数的表示!)转换字符串时, 采用 可选基地。转换 a 时提供碱基是错误的 非字符串。如果基数为零,则根据 字符串内容。如果参数超出整数范围 将改为返回长对象。

          hex的文档:

          hex(number) -> string
          
          Return the hexadecimal representation of an integer or long
          

          整数。

          【讨论】:

          • 这无法保留前导 0。
          • @Ignacio,你是对的,但我认为 OP 没有问这个问题。在任何情况下,++ 到您指出这一点的答案。
          • @Eli:OP 特别说他想要048d 即想要前导零,不想要0x
          • 这可能不会保留前导零,但它比下面的聪明技巧更具可读性。
          【解决方案5】:

          在python3上使用hexlify函数:

          import binascii
          def bin2hex(str1):
              bytes_str = bytes(str1, 'utf-8')
              return binascii.hexlify(bytes_str)
          
          a="abc123"
          c=bin2hex(a)
          c
          

          会还给你:

          b'616263313233'
          

          你可以像这样得到它的字符串:

          c.decode('utf-8')
          

          给予:

          '616263313233'
          

          【讨论】:

            【解决方案6】:

            使用python的binascii模块

            import binascii
            
            binFile = open('somebinaryfile.exe','rb')
            binaryData = binFile.read(8)
            
            print binascii.hexlify(binaryData)
            

            【讨论】:

              【解决方案7】:

              无论出于何种原因,我对其中一些答案有疑问,我已经为自己编写了几个帮助函数,所以如果你遇到像我一样的问题,试试这些。

              def bin_string_to_bin_value(input):
                 highest_order = len(input) - 1
                 result = 0
                 for bit in input:
                    result = result + int(bit) * pow(2,highest_order)
                    highest_order = highest_order - 1
                 return bin(result)
              
              def hex_string_to_bin_string(input):
                 lookup = {"0" : "0000", "1" : "0001", "2" : "0010", "3" : "0011", "4" : "0100", "5" : "0101", "6" : "0110", "7" : "0111", "8" : "1000", "9" : "1001", "A" : "1010", "B" : "1011", "C" : "1100", "D" : "1101", "E" : "1110", "F" : "1111"}
                 result = ""
                 for byte in input:
                    result =  result + lookup[byte]
                 return result
              def hex_string_to_hex_value(input):
                 bin_string = hex_string_to_bin_string(input)
                 bin_value = bin_string_to_bin_value(bin_string)
                 return hex(int(bin_value, 2))
              

              它们似乎运作良好。

              print hex_string_to_hex_value("FF")
              print hex_string_to_hex_value("01234567")
              print bin_string_to_bin_value("11010001101011")
              

              结果:

              0xff
              0x1234567
              0b11010001101011
              

              【讨论】:

              • bin_value_to_hex_string 在哪里?
              【解决方案8】:

              不使用凌乱的连接和填充:

              '{:0{width}x}'.format(int(temp,2)), width=4)
              

              将给出保留填充的十六进制表示

              【讨论】:

                【解决方案9】:
                format(int(bits, 2), '0' + str(len(bits) / 4) + 'x')
                

                【讨论】:

                • 转换前需要替换空格。
                【解决方案10】:

                在不忽略前导零的情况下将二进制转换为十六进制:

                你可以像这样使用 format() 内置函数:

                "{0:0>4X}".format(int("0000010010001101", 2))
                

                【讨论】:

                • 这仅适用于 2 字节数字,而 Ignacio 的答案适用于任何长度。
                • 如果有空格,你仍然需要替换。
                【解决方案11】:
                bstr = '0000 0100 1000 1101'.replace(' ', '')
                hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2))
                

                【讨论】:

                • @SO 应该真正添加每种语言的颜色。在这里,它认为 // 是一个 C++ 注释,并显示后面的所有内容。 // 在 Python 中不是注释,而是截断整数除法
                • 出色的答案。我很惊讶为什么它还没有被赞成/接受。
                • @Dennis 第一行只是清理二进制字符串。第二行将其格式化为十六进制字符串,填充到 (len(bstr) + 3) // 4 十六进制数字,这是 number of bits / 4 向上取整,即所需的十六进制数字的数量。第二行的最后一部分将二进制字符串解析为数字,因为 %X 格式说明符用于数字而不是二进制字符串。
                • Python 3 中的等价物是什么?使用 "".format()
                【解决方案12】:
                >>> import string
                >>> s="0000 0100 1000 1101"
                >>> ''.join([ "%x"%string.atoi(bin,2) for bin in s.split() ]  )
                '048d'
                >>>
                

                >>> s="0000 0100 1000 1101"
                >>> hex(string.atoi(s.replace(" ",""),2))
                '0x48d'
                

                【讨论】:

                • 那么问题出在哪里?它仍然在 Python 2.6 中
                • 为了在 1.X 中使用它的人们的利益,它仍在 2.X 中。 string.atoi() 是根据 2.6 文档 """Deprecated since version 2.0: Use the int() built-in function.""" 并且在 3.X 中不存在。 string.atoi() 的 2.X 实现调用 int()。没有充分的理由告诉一些新手 string.atoi() 甚至存在,更不用说告诉他们使用它而不是告诉他们使用 int()。
                【解决方案13】:

                假设它们按 4 分组并用空格分隔。这会保留前导 0。

                b = '0000 0100 1000 1101'
                h = ''.join(hex(int(a, 2))[2:] for a in b.split())
                

                【讨论】:

                • 那里不需要列表理解
                猜你喜欢
                • 1970-01-01
                • 2010-11-17
                • 2017-05-26
                • 1970-01-01
                • 2019-08-23
                • 1970-01-01
                • 1970-01-01
                • 2013-11-24
                相关资源
                最近更新 更多