2010-01-15 40 views

risposta

46

Benvenuti in StackOverflow!

int data base 2 e quindi hex:

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

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

Il dottore di int:

int(x[, base]) -> integer 

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

punto argomento verrà troncato a zero (questo non include una rappresentazione di stringa di un numero in virgola mobile!) Quando si converte una stringa, utilizzare la base opzionale. È un errore fornire una base quando si converte una stringa non . Se la base è zero, la base corretta viene calcolata in base al contenuto di stringa . Se l'argomento non rientra nell'intervallo intero, verrà restituito invece un oggetto lungo .

Il dottore di hex:

hex(number) -> string 

Return the hexadecimal representation of an integer or long 

intero.

+4

Questo non riesce a conservare 0 non significativi. –

+0

@ Ignacio, hai ragione, ma non penso che l'OP abbia chiesto questo. In ogni caso, ++ alla tua risposta per averlo indicato. –

+3

@Eli: l'OP ha detto espressamente che voleva '048d', cioè vuole portare zero, NON desidera 0x –

0

Supponendo che siano raggruppati per 4 e separati da spazi bianchi. Ciò preserva il principale 0.

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

non hai bisogno di comprensione di lista lì – SilentGhost

+0

buon punto. non so perché lo faccio sempre –

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

@SO dovrebbe davvero aggiungere colorazione per lingua. Qui pensa che // sia un commento in C++ e ignora tutto ciò che segue. // in Python non è un commento, ma troncando la divisione intera –

+0

Risposta brillante. Sono sorpreso del fatto che non sia ancora pubblicizzato/accettato. – Andrei

+2

Puoi spiegare come/perché funziona? – Dennis

-3
>>> import string 
>>> s="0000 0100 1000 1101" 
>>> ''.join([ "%x"%string.atoi(bin,2) for bin in s.split() ] ) 
'048d' 
>>> 

o

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

L'utilizzo del modulo stringa è così anni 1990 ... –

+0

quindi qual è il problema? È ancora in Python 2.6 – ghostdog74

+1

È ancora in 2.X per il beneficio delle persone che lo stavano usando in 1.X. string.atoi() è conforme alla documentazione 2.6 "" "Deprecato dalla versione 2.0: utilizza la funzione integrata int()." "" e non è presente in 3.X. L'implementazione 2.X di string.atoi() chiama int(). Non c'è una buona ragione per dire ad alcuni nuovi arrivati ​​che string.atoi() esiste anche per non dire loro di usarlo invece di dire loro di usare int(). –

6

Conversione binario in esadecimale senza ignorare gli zeri iniziali:

Si potrebbe utilizzare il formato() built-in funzione come questa:

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

Funziona solo con numeri a 2 byte, mentre la risposta di Ignacio funziona a qualsiasi lunghezza. – Andrei

+0

È ancora necessario sostituire gli spazi, se presenti. – Andrei

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

È necessario sostituire gli spazi prima della conversione. – Andrei

3

Utilizzando non concatenazioni disordinato e padding:

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

darà una rappresentazione esadecimale con imbottitura conservato

0

Per una qualche ragione ho avuto problemi con alcune di queste risposte, ho andato e ho scritto un paio di funzioni di supporto per me stesso, quindi se hai problemi come quello che ho fatto, prova questi.

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)) 

Sembrano funzionare bene.

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

risultati in: modulo binascii

0xff 
0x1234567 
0b11010001101011 
+3

Dove si trova bin_value_to_hex_string? –

7

Usa di pitone

import binascii 

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

print binascii.hexlify(binaryData) 
Problemi correlati