2010-07-15 28 views
8

J'ai une valeur hexadécimale dans une chaîne commeConversion d'hexagone en binaire sans perdre le 0 de python

h = '00112233aabbccddee' 

Je sais que je peux convertir en binaire avec:

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

Cependant, cela perd les 0 principaux. Est-il possible de faire cette conversion sans perdre les 0? Ou est le meilleur moyen de le faire juste pour compter le nombre de 0 avant la conversion, puis l'ajouter après.

+1

est-il une raison particulière vous avez besoin de 'de 0'? –

+1

J'utilise la valeur h plus tard comme clé d'un dictionnaire. La clé a cependant tous les 0 principaux. – root

+0

Y a-t-il une raison impérieuse pour que vous utilisiez une représentation de chaîne binaire de la valeur plutôt qu'un nombre entier pour la clé de dictionnaire? –

Répondre

15

Je ne pense pas qu'il existe un moyen de conserver ces zéros en tête par défaut.

Chaque chiffre hexadécimal se traduit par 4 chiffres binaires, donc la longueur de la nouvelle chaîne doit être exactement 4 fois la taille de l'original.

h_size = len(h) * 4 

Ensuite, vous pouvez utiliser .zfill pour remplir de zéros à la taille souhaitée:

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

Je pense que cela m'a donné 3 0 supplémentaires pour une raison quelconque – root

+0

Ah ça ne fonctionne pas parfaitement. Je ne comptais pas les 0 avant le premier nombre hexadécimal non nul. Merci. – root

+0

@root: non lié: ne réutilise pas le nom 'h' pour différentes choses, par exemple, utilise le nom' bits' pour le résultat: 'bits = bin (int (h, 16)) [2:] .zfill (len (h) * 4) ' – jfs

2

Fondamentalement, le même mais le rembourrage 4 bindigits chaque hexdigit

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

Un débutant à python tel que je procéderais comme si

datastring = 'HexInFormOfString' 

Rembourrage pour accueillir les zéros précédents, le cas échéant, lorsque python convertit une chaîne en hexadécimal.

datastrPadded = 'ffff' + datastring 

Convertissez la valeur capitonnée en binaire.

databin = bin(int(datastrPadded,16)) 

2bits Retirez ('de 0b') qui ajoute python pour désigner les bits binaires + 16 rembourrées.

databinCrop = databin[18:] 
0

Ceci convertit une chaîne hexadécimale en une chaîne binaire. Puisque vous voulez que la longueur dépende de l'original, cela peut être ce que vous voulez.

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

Ceci est en fait assez facile en Python, car il n'a aucune limite sur la taille des entiers. Ajoutez simplement un '1' à la chaîne hexadécimale et déposez le '1' correspondant à la sortie.

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

Je cherchais exactement cela pour une heure! –

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