2010-01-15 298 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) 
相關問題