2010-01-15 297 views

回答

46

欢迎来到StackOverflow!

int给定基体2,然后hex

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

>>> hex(int('0000010010001101', 2)) 
'0x48d' 

int的DOC:

int(x[, base]) -> integer 

Convert a string or number to an integer, if possible. A floating 

点 参数将朝向零被截断(这不包括串 表示的浮点数!)在转换字符串时, 使用 可选的基地。在转换 非字符串时提供基数是错误的。如果基数为零,则基于 字符串内容猜测正确的基数。如果参数超出整数范围,将返回一个长 长对象。

hex的DOC:

hex(number) -> string 

Return the hexadecimal representation of an integer or long 

整数。

+4

这未能保持领先的0。 – 2010-01-15 14:58:26

+0

@Ignacio,你说得对,但我不认为OP会问这个。在任何情况下,++都会指出你的答案。 – 2010-01-15 16:14:38

+3

@Eli:OP明确表示他想要'048d',即想要领先0,不想要0x – 2010-01-15 20:44:07

0

假设它们被4分组并被空白分隔。这保持领先的0

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

你不需要列表理解 – SilentGhost 2010-01-15 15:00:57

+0

好点。不知道为什么我总是这样做。 – 2010-01-15 15:13:16

20
bstr = '0000 0100 1000 1101'.replace(' ', '') 
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2)) 
+4

@SO应该真的添加每种语言的着色。在这里,它认为//是一个C++评论,并且为后面的所有内容涂上灰色。 //在Python中不是注释,而是截断整数除法 – 2010-01-15 16:16:12

+0

明智的答案。我很惊讶为什么它没有被提升/接受呢。 – Andrei 2013-07-23 09:03:41

+2

你能解释一下/为什么这是可行的? – Dennis 2013-10-30 17:31:29

-3
>>> 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' 
+2

使用字符串模块是如此的20世纪90年代...... – 2010-01-15 20:41:24

+0

所以有什么问题?它仍然在Python 2.6 – ghostdog74 2010-01-15 23:51:30

+1

对于在1.X中使用它的人来说,它仍然在2.X中。 string.atoi()是根据2.6文档“”“从2.0版开始弃用:使用int()内置函数。”“”并且不存在于3.X中。 string.atoi()的2.X实现调用int()。告诉一些新手string.atoi()甚至不存在,更不用说告诉他们使用它而不是告诉他们使用int()。 – 2010-01-16 09:08:51

6

二进制转换为十六进制,而不忽略前导零:

您可以使用格式()内置功能如下:

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

这仅适用于2字节数字,而Ignacio的答案适用于任何长度。 – Andrei 2013-07-23 08:53:07

+0

如果需要,您仍需要替换空格。 – Andrei 2013-07-23 09:01:17

0
format(int(bits, 2), '0' + str(len(bits)/4) + 'x') 
+0

您需要在转换之前替换空格。 – Andrei 2013-07-23 08:57:42

3

使用没有凌乱的串连和padding:

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

会给出一个十六进制表示与填充保留

0

无论出于何种原因,我有问题的一些回答这些问题,我已经去了并为我自己写了一些帮助函数,所以如果你像我一样遇到问题,请尝试一下。

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("") 
print bin_string_to_bin_value("11010001101011") 

结果:

0xff 
0x1234567 
0b11010001101011 
+3

bin_value_to_hex_string在哪里? – 2015-07-10 09:56:33

7

使用Python的binascii模块

import binascii 

binFile = open('somebinaryfile.exe','rb') 
binaryData = binFile.read(8) 

print binascii.hexlify(binaryData) 
相关问题