Convertir Hex en Byte en Python

Rayven Esplanada 19 septembre 2023
  1. Initialiser une valeur hexadécimale
  2. Utilisez la fonction bytes.fromhex() pour convertir Hex en Byte en Python
  3. Utilisez le module binascii pour convertir un Hex en Byte en Python
  4. Utilisez la méthode codecs.decode() pour convertir une chaîne hexadécimale en octet en Python.
  5. Utiliser la Compréhension de Liste et la Fonction int() pour Convertir un Hexadécimal en Octet en Python
  6. Conclusion
Convertir Hex en Byte en Python

Hexadécimal, souvent abrégé en hex, utilise 16 symboles (0-9, a-f) pour représenter des valeurs, contraste avec les 10 symboles décimaux. Par exemple, 1000 en décimal est 3E8 en hex.

La maîtrise de la manipulation de l’hexadecimal est cruciale pour les tâches de programmation impliquant des données binaires, des adresses mémoire et un encodage de bas niveau. Ce tutoriel expliquera comment convertir des valeurs hexadécimales en une littérale de byte en Python.

Initialiser une valeur hexadécimale

Créons une valeur hexadécimale en utilisant une chaîne de caractères et convertissons la phrase A quick brown fox en une valeur hexadécimale en utilisant la fonction hexlify() dans le module binascii.

Pour convertir une chaîne de caractères en hexadécimal, nous devons d’abord convertir la chaîne en byte.

import binascii

str_val = "A quick brown fox".encode("utf-8")
hex_val = binascii.hexlify(str_val).decode("utf-8")

print(hex_val)

Résultat :

4120717569636b2062726f776e20666f78

Nous avons réussi à convertir une chaîne de caractères en hexadécimal. Ensuite, passons à la conversion de l’hexadécimal en bytes.

Utilisez la fonction bytes.fromhex() pour convertir Hex en Byte en Python

La méthode bytes.fromhex() est conçue pour convertir une chaîne hexadécimale valide en un objet bytes. Elle a la syntaxe suivante :

bytes.fromhex(hex_string)
  • hex_string : Il s’agit d’un argument obligatoire représentant la chaîne hexadécimale que vous souhaitez convertir en une littérale de byte.

Voici comment fonctionne la méthode bytes.fromhex() :

  1. Validation de l’entrée : La méthode valide d’abord la chaîne de caractères hex_string pour s’assurer qu’elle ne contient que des caractères hexadécimaux valides (chiffres 0-9 et lettres minuscules ou majuscules A-F). Si la chaîne contient d’autres caractères, une ValueError sera levée.
  2. Analyse des paires : La méthode traite la chaîne hexadécimale deux caractères à la fois, en traitant chaque paire de caractères comme un seul byte hexadécimal. Cela signifie que pour chaque deux caractères dans la chaîne d’entrée, un byte est généré dans l’objet bytes résultant.
  3. Conversion en bytes : Chaque paire de caractères hexadécimaux est convertie en son équivalent binaire.
  4. Construction de l’objet bytes : À mesure que la méthode traite les paires de caractères hexadécimaux, elle construit un objet bytes en ajoutant la représentation binaire de chaque byte. Ce processus se poursuit jusqu’à ce que la chaîne d’entrée entière ait été traitée.
  5. Valeur de retour : Une fois que la chaîne d’entrée entière a été traitée, la méthode renvoie l’objet bytes résultant, qui représente la littérale de byte équivalente à la chaîne hexadécimale d’entrée.

À titre d’exemple, nous allons prendre la valeur hexadécimale du résultat précédent et utiliser fromhex() pour la convertir en une littérale de byte.

hex_val = "4120717569636b2062726f776e20666f78"

print(bytes.fromhex(hex_val))

Sortie :

b'A quick brown fox'

Analysons maintenant la chaîne hexadécimale d’exemple 4120717569636b2062726f776e20666f78 pour mieux comprendre comment elle est convertie en une littérale de byte :

  • 41 devient le byte 65 (valeur ASCII de 'A').
  • 20 devient le byte 32 (valeur ASCII de l’espace).
  • 71 devient le byte 113 (valeur ASCII de 'q').
  • 75 devient le byte 117 (valeur ASCII de 'u').
  • 69 devient le byte 105 (valeur ASCII de 'i').
  • 63 devient le byte 99 (valeur ASCII de 'c').
  • 6b devient le byte 107 (valeur ASCII de 'k').
  • 20 devient le byte 32 (valeur ASCII de l’espace).
  • 62 devient le byte 98 (valeur ASCII de 'b').
  • 72 devient le byte 114 (valeur ASCII de 'r').
  • 6f devient le byte 111 (valeur ASCII de 'o').
  • 77 devient le byte 119 (valeur ASCII de 'w').
  • 6e devient le byte 110 (valeur ASCII de 'n').
  • 20 devient le byte 32 (valeur ASCII de l’espace).
  • 66 devient le byte 102 (valeur ASCII de 'f').
  • 6f devient le byte 111 (valeur ASCII de 'o').
  • 78 devient le byte 120 (valeur ASCII de 'x').

Lorsque tous ces bytes sont combinés, vous obtenez la littérale de byte A quick brown fox, qui est le résultat final.

Utilisez le module binascii pour convertir un Hex en Byte en Python

Le module Python binascii contient des fonctions utilitaires efficaces pour les opérations binaires et ASCII. En particulier, unhexlify() est une fonction du module binascii qui convertit une valeur hexadécimale en une littérale de byte.

Cette fonction a la syntaxe suivante :

binascii.unhexlify(hex_string)
  • hex_string : Il s’agit de l’argument requis représentant la chaîne hexadécimale d’entrée que vous souhaitez convertir en une littérale de byte.

Voici une explication détaillée de son fonctionnement :

  1. Validation de l’entrée : La méthode commence par valider l’argument hex_string pour s’assurer qu’il ne contient que des caractères hexadécimaux valides. Tous caractères invalides dans la chaîne d’entrée entraîneront une exception binascii.Error.
  2. Conversion des paires hexadécimales : Ensuite, la méthode traite la chaîne hex_string par paires de caractères. Par exemple, 41 représente le byte avec la valeur entière 65 (valeur ASCII de A).
  3. Conversion en octets: Les paires de bytes hexadécimaux sont converties en leur représentation binaire. Chaque paire est transformée en un octet correspondant, chaque caractère représentant 4 bits.
  4. Construction du literal d’octets: Au fur et à mesure que la méthode traite chaque paire, elle ajoute les octets binaires résultants pour former un literal d’octets complet. Ce processus se poursuit jusqu’à ce que la chaîne d’entrée entière ait été traitée.
  5. Valeur de retour: Une fois que l’ensemble de la hex_string a été traité, la fonction unhexlify() renvoie le literal d’octets résultant, représenté par un objet bytes.

Initialisons un nouvel exemple avec des caractères spéciaux non-ASCII, qui seront ensuite convertis en une valeur hexadécimale. L’exemple sera la traduction grecque de l’expression A quick brown fox.

import binascii
from binascii import unhexlify

str_val = "Μια γρήγορη καφέ αλεπού".encode(
    "utf-8"
)  # A quick brown fox in Greek translation
hex_val = binascii.hexlify(str_val).decode("utf-8")

print("String value: ", str_val.decode("utf-8"))
print("Hexadecimal: ", hex_val)
print("Byte value: ", unhexlify(hex_val))

Sortie:

String value:  Μια γρήγορη καφέ αλεπού
Hexadecimal:  ce9cceb9ceb120ceb3cf81ceaeceb3cebfcf81ceb720cebaceb1cf86cead20ceb1cebbceb5cf80cebfcf8d
Byte value:  b'\xce\x9c\xce\xb9\xce\xb1 \xce\xb3\xcf\x81\xce\xae\xce\xb3\xce\xbf\xcf\x81\xce\xb7 \xce\xba\xce\xb1\xcf\x86\xce\xad \xce\xb1\xce\xbb\xce\xb5\xcf\x80\xce\xbf\xcf\x8d'

Nous avons maintenant réussi à convertir des valeurs hexadécimales en octets.

Utilisez la méthode codecs.decode() pour convertir une chaîne hexadécimale en octet en Python.

La fonction codecs.decode() peut également être utilisée pour convertir une chaîne hexadécimale en octets. Elle fait partie du module codecs de Python, qui offre différentes fonctionnalités d’encodage et de décodage pour différentes représentations de données.

Elle a la syntaxe suivante:

codecs.decode(data, encoding, errors="strict")
  • data: C’est l’argument requis représentant les données que vous souhaitez décoder. Dans ce cas, il devrait s’agir de la chaîne hexadécimale que vous souhaitez convertir en un literal d’octets.
  • encoding: C’est également un argument requis spécifiant l’encodage à utiliser pour le décodage. Lorsque vous travaillez avec des chaînes hexadécimales, vous devez utiliser l’encodage hex pour indiquer que la chaîne d’entrée représente une valeur hexadécimale.
  • errors (facultatif): Cet argument spécifie la manière de gérer les erreurs de décodage, par exemple lorsque la chaîne d’entrée contient des caractères non valides pour l’encodage spécifié. Il a une valeur par défaut de strict, mais vous pouvez le changer en ignore ou replace pour gérer les erreurs différemment.

Voici une explication détaillée de la façon dont cette méthode fonctionne lorsqu’elle est utilisée pour décoder des valeurs hexadécimales:

  1. Validation de l’entrée: La méthode vérifie d’abord la validité de l’argument data pour s’assurer qu’il ne contient que des caractères hexadécimaux valides. Si la chaîne d’entrée contient des caractères non hexadécimaux, elle lèvera une UnicodeDecodeError avec des détails sur le caractère problématique.
  2. Processus de décodage: La fonction codecs.decode() interprète l’argument data comme une chaîne hexadécimale et la convertit en données binaires. Elle traite la chaîne d’entrée par paires de caractères, traitant chaque paire comme un seul octet hexadécimal.
  3. Spécification de l’encodage: L’argument encoding est crucial dans ce contexte. Lorsque vous spécifiez 'hex' comme l’encodage, cela indique à Python d’interpréter la chaîne d’entrée comme une valeur hexadécimale et de la convertir en conséquence.
  4. Conversion en octets: Au fur et à mesure que la méthode traite chaque paire de caractères hexadécimaux, elle les convertit en leur représentation binaire. Cette transformation aboutit à la création d’un literal d’octets, où chaque paire de caractères correspond à un seul octet.
  5. Valeur de retour: La méthode codecs.decode() renvoie le literal d’octets résultant en tant qu’objet bytes, représentant les données binaires décodées.

Voici l’exemple ci-dessous :

import codecs

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = codecs.decode(hex_val, "hex")
print(byte_val)

Ce programme décode la chaîne hex_val en utilisant la fonction codecs.decode() avec l’argument d’encodage défini sur 'hex'. Cela signifie qu’il interprétera la chaîne d’entrée comme une valeur hexadécimale et la convertira en octets.

Sortie :

b'A quick brown fox'

Utiliser la Compréhension de Liste et la Fonction int() pour Convertir un Hexadécimal en Octet en Python

Cette méthode consiste à utiliser la compréhension de liste et la fonction int() pour convertir une chaîne hexadécimale en octets.

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = bytes([int(hex_val[i : i + 2], 16) for i in range(0, len(hex_val), 2)])
print(byte_val)

Ici, le code utilise une compréhension de liste pour parcourir la chaîne hexadécimale par paires de deux caractères, convertit chaque paire en un entier en base 16 (hexadécimal) et crée une liste de ces entiers.

Le constructeur bytes() est ensuite utilisé pour convertir cette liste d’entiers en un objet octets.

Sortie :

b'A quick brown fox'

Cette méthode est particulièrement utile lorsque nous avons une chaîne hexadécimale avec une structure connue et que nous souhaitons la convertir efficacement en octets. Elle permet de contrôler le processus de conversion en nous permettant de spécifier la base d’encodage (dans ce cas, la base 16 pour l’hexadécimal).

Conclusion

Dans cet article, nous avons examiné quelques façons de convertir des valeurs hexadécimales en littéraux d’octets en Python.

La fonction fromhex() est préférable si vous ne souhaitez pas ajouter d’importations supplémentaires dans votre code source. Sinon, vous pouvez choisir la méthode qui convient le mieux à vos besoins et à votre style de codage.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Article connexe - Python Bytes

Article connexe - Python Hex