138 votes

Convertir l'hexagone en binaire

J'ai ABC123EFFF.

Je veux avoir 001010101111000001001000111111111111 (c'est-à-dire une représentation binaire avec, disons, 42 chiffres et des zéros de tête).

Comment ?

18voto

nobody Points 193

Utiliser Built-in fonction format() y Fonction int() C'est simple et facile à comprendre. C'est une version un peu simplifiée de Réponse d'Aaron

int()

int(string, base)

format()

format(integer, # of bits)

Exemple

# w/o 0b prefix
>> format(int("ABC123EFFF", 16), "040b")
1010101111000001001000111110111111111111

# with 0b prefix
>> format(int("ABC123EFFF", 16), "#042b")
0b1010101111000001001000111110111111111111

# w/o 0b prefix + 64bit
>> format(int("ABC123EFFF", 16), "064b")
0000000000000000000000001010101111000001001000111110111111111111

Voir aussi cette réponse

14voto

Markus Points 307
"{0:020b}".format(int('ABC123EFFF', 16))

10voto

John Montgomery Points 3770

Voici un moyen assez brut de le faire en utilisant des manipulations de bits pour générer les chaînes binaires.

Ce qu'il faut comprendre, c'est que :

(n & (1 << i)) and 1

Ce qui génère un 0 ou un 1 si le iième bit de n est activé.

import binascii

def byte_to_binary(n):
    return ''.join(str((n & (1 << i)) and 1) for i in reversed(range(8)))

def hex_to_binary(h):
    return ''.join(byte_to_binary(ord(b)) for b in binascii.unhexlify(h))

print hex_to_binary('abc123efff')

>>> 1010101111000001001000111110111111111111

Edit : en utilisant le "nouvel" opérateur ternaire ceci :

(n & (1 << i)) and 1

Deviendrait :

1 if n & (1 << i) or 0

(Je ne suis pas sûr que ce soit très lisible).

5voto

hbdgaf Points 400

Il s'agit d'une légère retouche de la solution de Glen Maynard, qui me semble être la bonne façon de procéder. Elle ajoute simplement l'élément de remplissage.

    def hextobin(self, hexval):
        '''
        Takes a string representation of hex data with
        arbitrary length and converts to string representation
        of binary.  Includes padding 0s
        '''
        thelen = len(hexval)*4
        binval = bin(int(hexval, 16))[2:]
        while ((len(binval)) < thelen):
            binval = '0' + binval
        return binval

Je l'ai sorti d'un cours. Sortez juste self, si vous travaillez dans un script autonome.

5voto

Edd Points 577

J'ai ajouté le calcul du nombre de bits à remplir à la solution d'Onedinkenedi. Voici la fonction résultante :

def hextobin(h):
  return bin(int(h, 16))[2:].zfill(len(h) * 4)

Où 16 est la base à partir de laquelle vous convertissez (hexadécimal), et 4 est le nombre de bits dont vous avez besoin pour représenter chaque chiffre, ou log base 2 de l'échelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X