Python从二进制字符串转换为十六进制

Posted

技术标签:

【中文标题】Python从二进制字符串转换为十六进制【英文标题】:Python conversion from binary string to hexadecimal 【发布时间】:2011-01-05 13:16:38 【问题描述】:

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

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

【问题讨论】:

【参考方案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】:

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

':0widthx'.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())

【讨论】:

那里不需要列表理解

以上是关于Python从二进制字符串转换为十六进制的主要内容,如果未能解决你的问题,请参考以下文章

将任何文件转换为二进制字符串并从二进制转换为文件[关闭]

Pentaho Kettle - 从二进制类型的字段将十六进制转换为数字

如何用python把二进制数转换为十进制数?

在C中从二进制转换为char

求教如何Python十进制小数和二进制小数相互转换的实现方式,用代码表示出来,谢谢

python常用的十进制16进制字符串字节串之间的转换