2010-07-15 14 views
8

ho un valore esadecimale in una stringa comeConversione da esadecimale a binario senza perdere leader pitone 0 di

h = '00112233aabbccddee' 

So che posso convertire questo a binario con:

h = bin(int(h, 16))[2:] 

Tuttavia, questo perde gli 0 principali. Esiste comunque la possibilità di fare questa conversione senza perdere gli 0? O è il modo migliore per farlo solo per contare il numero di 0 iniziali prima della conversione, quindi aggiungerlo in seguito.

+1

C'è un motivo particolare sono necessari i 0' di '? –

+1

Sto usando il valore h più tardi come chiave per un dizionario. La chiave tuttavia ha tutti gli 0 iniziali. – root

+0

Esiste un motivo valido per cui si sta utilizzando una rappresentazione di stringa binaria del valore anziché un numero intero per la chiave del dizionario? –

risposta

15

non credo che ci sia un modo per mantenere quei zeri iniziali di default.

Ciascuna cifra esadecimale traduce 4 cifre binarie, quindi la lunghezza della nuova stringa dovrebbe essere esattamente 4 volte la dimensione originale.

h_size = len(h) * 4 

Quindi, è possibile utilizzare .zfill per riempire zeri per le dimensioni desiderate:

h = (bin(int(h, 16))[2:]).zfill(h_size) 
+0

Penso che questo mi abbia dato 3 O in più per qualche motivo – root

+0

Ah, non funziona perfettamente. Non stavo contando gli 0 prima del primo numero esadecimale non zero. Grazie. – root

+0

@root: non correlato: non riutilizzare il nome 'h' per cose diverse, ad esempio, usa il nome' bits' per il risultato: 'bits = bin (int (h, 16)) [2:]. Zfill (len (h) * 4) ' – jfs

2

In sostanza lo stesso, ma imbottitura a 4 bindigits ogni hexdigit

''.join(bin(int(c, 16))[2:].zfill(4) for c in h) 
0

un novizio di python quali vorrei procedere in questo modo

datastring = 'HexInFormOfString' 

Riempimento per contenere eventuali zeri precedenti, quando Python converte la stringa in Esadecimale.

datastrPadded = 'ffff' + datastring 

Convertire il valore inserito in binario.

databin = bin(int(datastrPadded,16)) 

Rimuovere 2bits ('0b') che python aggiunge per indicare binari + 16 bit imbottiti.

databinCrop = databin[18:] 
0

Converte una stringa esadecimale in una stringa binaria. Dal momento che vuoi che la lunghezza dipenda dall'originale, questo potrebbe essere ciò che desideri.

data = "" 
while len(h) > 0: 
    data = data + chr(int(h[0:2], 16)) 
    h = h[2:] 
print h 
6

Questo è in realtà abbastanza facile in Python, dal momento che non ha alcun limite alla dimensione degli interi. Basta anteporre un '1' alla stringa esadecimale e rimuovere il corrispondente '1' dall'output.

>>> h = '00112233aabbccddee' 
>>> bin(int(h, 16))[2:] # old way 
'1000100100010001100111010101010111011110011001101110111101110' 
>>> bin(int('1'+h, 16))[3:] # new way 
'000000000001000100100010001100111010101010111011110011001101110111101110' 
+0

State cercando esattamente questo per un'ora! –

0
hexa = '91278c4bfb3cbb95ffddc668d995bfe0' 
binary = bin(int(hexa, 16))[2:] 
print binary 
hexa_dec = hex(int(binary, 2))[2:] 
print hexa_dec 
Problemi correlati