HOWTO · Python

Chaîne en hexadécimal en Python

Ce tutoriel montre comment convertir une chaîne en hexadécimal en Python

Sur cette page

Une chaîne Python est du texte ; sa représentation hexadécimale peut correspondre aux octets produits par un encodage ou au point de code Unicode de chaque caractère. Pour obtenir une représentation portable en octets, choisissez un encodage, appelez encode(), puis convertissez ces octets avec bytes.hex(). UTF-8 est un choix courant lorsque le résultat doit préserver le texte non ASCII d’un système à l’autre.

L’exemple ci-dessous compare, pour un même texte, l’hexadécimal des octets UTF-8 et celui des points de code. Pour cette entrée, il affiche d’abord l’hexadécimal compact des octets UTF-8, puis ces mêmes octets séparés par des espaces, et enfin l’hexadécimal des points de code sans remplissage. Les libellés et les sorties de l’exemple restent en anglais.

Convertir une chaîne Python en hexadécimal avec encode() et hex()

str.encode() convertit le texte en octets à l’aide de l’encodage indiqué. La méthode hex() de l’objet bytes renvoie ensuite deux chiffres hexadécimaux pour chaque octet. L’encodage compte : par exemple, en UTF-8, é est encodé sur deux octets ; sa représentation hexadécimale en octets est donc c3a9, tandis que son point de code est e9.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

text = "Café"
encoded = text.encode("utf-8")
print(encoded.hex())
print(encoded.hex(" "))
print("".join(hex(ord(character))[2:] for character in text))
436166c3a9
43 61 66 c3 a9
436166e9

La première ligne est la représentation compacte des octets UTF-8 en hexadécimal ; la deuxième sépare chaque octet par une espace pour faciliter la lecture. La troisième ligne affiche les points de code et correspond donc à une autre représentation. Utilisez la forme sans séparateurs lorsque vous avez besoin d’une chaîne hexadécimale continue classique ; les séparateurs facilitent l’inspection, mais font partie de la chaîne renvoyée.

Utiliser binascii.hexlify() comme solution de remplacement

La fonction de la bibliothèque standard binascii.hexlify() convertit elle aussi des octets en octets représentant leur valeur hexadécimale. Encodez d’abord la chaîne, puis décodez le résultat si l’étape suivante attend une chaîne de texte Python :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import binascii

text = "Café"
hex_text = binascii.hexlify(text.encode("utf-8")).decode("ascii")

La valeur de hex_text est 436166c3a9.

Avant le décodage, la valeur renvoyée est un objet bytes contenant des caractères ASCII, comme b'436166c3a9'. Le décodage en ASCII convient, car les chiffres hexadécimaux sont des caractères ASCII, quel que soit l’encodage du texte d’origine. Cette méthode est utile lorsqu’une API attend précisément binascii ou une sortie de type bytes ; pour obtenir une chaîne de texte ordinaire, bytes.hex() est plus court.

Convertir les points de code des caractères avec ord() et hex()

Pour représenter le point de code Unicode de chaque caractère plutôt que ses octets encodés, appliquez ord() à chaque caractère, puis transmettez l’entier obtenu à hex(). Supprimez le préfixe 0x si vous ne voulez garder que les chiffres. Cette représentation diffère de celle d’UTF-8 : le point de code de é est e9, tandis que ses octets UTF-8 sont c3 a9.

La concaténation des chiffres des points de code peut rendre leurs limites ambiguës lorsque leurs longueurs varient. Par exemple, les points de code 0x41 et 0x1f600 deviennent 411f600 sans séparateur : on ne voit pas où l’un se termine et où l’autre commence. Conservez des délimiteurs ou utilisez un remplissage de largeur fixe si un autre programme doit analyser les points de code séparément.

Choisir entre octets encodés et points de code des caractères

Choisissez text.encode(encoding).hex() lorsque vous avez besoin des octets qui seront stockés, transmis ou comparés selon un encodage précis. Choisissez la méthode avec ord() uniquement si vous avez spécifiquement besoin des points de code Unicode ; elle ne produit pas la séquence d’octets encodée.

La fonction intégrée hex() de Python accepte un entier, pas une chaîne. L’appliquer directement à du texte déclenche une TypeError. Convertir avec int(value, 16) une chaîne numérique qui contient déjà des chiffres hexadécimaux est une opération d’analyse distincte, et non une façon d’encoder du texte quelconque. Pour convertir une chaîne en hexadécimal de manière habituelle, précisez l’encodage, puis utilisez encode() suivi de hex().