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 ?

137voto

Onedinkenedi Points 309

Pour résoudre le problème du zéro arrière du côté gauche :


my_hexdata = "1a"

scale = 16 ## equals to hexadecimal

num_of_bits = 8

bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)

Il donnera 00011010 au lieu de la version rognée.

72voto

rahul Points 84185
import binascii

binary_string = binascii.unhexlify(hex_string)

Lire

binascii.unhexlify

Renvoie les données binaires représentées par la chaîne hexadécimale spécifiée en paramètre.

62voto

Aaron Hall Points 7381

Convertir l'hexagone en binaire

J'ai ABC123EFFF.

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

Réponse courte :

Les nouvelles chaînes f de Python 3.6 vous permettent de le faire en utilisant une syntaxe très concise :

>>> f'{0xABC123EFFF:0>42b}'
'001010101111000001001000111110111111111111'

ou de rompre avec la sémantique :

>>> number, pad, rjust, size, kind = 0xABC123EFFF, '0', '>', 42, 'b'
>>> f'{number:{pad}{rjust}{size}{kind}}'
'001010101111000001001000111110111111111111'

Longue réponse :

Ce que vous dites en fait, c'est que vous avez une valeur dans une représentation hexadécimale, et que vous voulez représenter une valeur équivalente en binaire.

La valeur de l'équivalence est un nombre entier. Mais vous pouvez commencer par une chaîne de caractères, et pour visualiser en binaire, vous devez terminer par une chaîne de caractères.

Convertir l'hexagone en binaire, 42 chiffres et les zéros de tête ?

Nous disposons de plusieurs moyens directs d'atteindre cet objectif, sans avoir recours à des pirates utilisant des tranches.

Tout d'abord, avant toute manipulation binaire, convertissez en int (je suppose que c'est dans un format de chaîne de caractères, et non comme un littéral) :

>>> integer = int('ABC123EFFF', 16)
>>> integer
737679765503

Nous pourrions également utiliser un littéral entier exprimé sous forme hexadécimale :

>>> integer = 0xABC123EFFF
>>> integer
737679765503

Maintenant, nous devons exprimer notre entier dans une représentation binaire.

Utilisez la fonction intégrée, format

Ensuite, passez à format :

>>> format(integer, '0>42b')
'001010101111000001001000111110111111111111'

Cela utilise la fonction mini-langue .

Pour décomposer cela, voici la forme grammaticale de la chose :

[[fill]align][sign][#][0][width][,][.precision][type]

Pour en faire une spécification répondant à nos besoins, il suffit d'exclure les éléments dont nous n'avons pas besoin :

>>> spec = '{fill}{align}{width}{type}'.format(fill='0', align='>', width=42, type='b')
>>> spec
'0>42b'

et de le passer au format

>>> bin_representation = format(integer, spec)
>>> bin_representation
'001010101111000001001000111110111111111111'
>>> print(bin_representation)
001010101111000001001000111110111111111111

Formatage des chaînes (Templating) avec str.format

Nous pouvons l'utiliser dans une chaîne de caractères en utilisant str.format méthode :

>>> 'here is the binary form: {0:{spec}}'.format(integer, spec=spec)
'here is the binary form: 001010101111000001001000111110111111111111'

Ou alors, il suffit de mettre la spécification directement dans la chaîne originale :

>>> 'here is the binary form: {0:0>42b}'.format(integer)
'here is the binary form: 001010101111000001001000111110111111111111'

Formatage des chaînes de caractères avec les nouvelles f-strings

Faisons une démonstration des nouvelles cordes F. Elles utilisent les mêmes règles de formatage du mini-langage :

>>> integer = 0xABC123EFFF
>>> length = 42
>>> f'{integer:0>{length}b}'
'001010101111000001001000111110111111111111'

Maintenant, mettons cette fonctionnalité dans une fonction pour encourager la réutilisation :

def bin_format(integer, length):
    return f'{integer:0>{length}b}'

Et maintenant :

>>> bin_format(0xABC123EFFF, 42)
'001010101111000001001000111110111111111111'    

Aside

Si vous souhaitez simplement encoder les données sous forme de chaîne d'octets en mémoire ou sur le disque, vous pouvez utiliser la fonction int.to_bytes qui n'est disponible que dans Python 3 :

>>> help(int.to_bytes)
to_bytes(...)
    int.to_bytes(length, byteorder, *, signed=False) -> bytes
...

Et comme 42 bits divisés par 8 bits par octet égalent 6 octets :

>>> integer.to_bytes(6, 'big')
b'\x00\xab\xc1#\xef\xff'

59voto

Glenn Maynard Points 24451
bin(int("abc123efff", 16))[2:]

33voto

Simple Points 11
>>> bin( 0xABC123EFFF )

'0b1010101111000001001000111110111111111111'

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