HOWTO · Python

Da stringa a esadecimale in Python

Questo tutorial mostra come convertire una stringa in esadecimale in Python

In questa pagina

Una stringa Python è testo; la rappresentazione esadecimale può indicare i byte prodotti da una codifica oppure il punto di codice Unicode di ciascun carattere. Per ottenere una rappresentazione portabile dei byte, scegli una codifica, chiama encode() e converti i byte con bytes.hex(). UTF-8 è una scelta comune quando il risultato deve preservare il testo non ASCII tra sistemi diversi.

L’esempio seguente confronta, per lo stesso testo, i byte esadecimali in UTF-8 e i punti di codice in esadecimale. Con questo input, mostra prima i byte UTF-8 in forma compatta, poi raggruppati con spazi e infine i punti di codice senza padding.

Convertire una stringa Python in esadecimale con encode() e hex()

str.encode() converte il testo in byte usando la codifica specificata. Il metodo hex() dell’oggetto byte restituisce quindi due cifre esadecimali per ogni byte. La codifica fa la differenza: per esempio, in UTF-8 é viene codificato in due byte, quindi la sua rappresentazione esadecimale è c3a9, mentre il suo punto di codice è e9.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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 prima riga mostra i byte UTF-8 in forma compatta; la seconda separa i byte con uno spazio per facilitarne la lettura. La terza mostra i punti di codice, che hanno quindi un significato diverso. Usa la forma senza separatori quando ti serve una stringa esadecimale continua; i separatori sono utili per l’ispezione, ma fanno parte della stringa restituita. Le etichette e i risultati nel blocco di output restano in inglese.

Usare binascii.hexlify() come alternativa

La funzione della libreria standard binascii.hexlify() converte anch’essa i byte in byte esadecimali. Codifica prima la stringa, poi decodifica il risultato se il passaggio successivo richiede una stringa di testo Python:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

import binascii

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

Il valore di hex_text è 436166c3a9.

Prima della decodifica, il valore restituito è un oggetto bytes contenente caratteri ASCII, per esempio b'436166c3a9'. Decodificarlo con ASCII è appropriato perché le cifre esadecimali sono caratteri ASCII, indipendentemente dalla codifica del testo originale. Questo metodo è utile quando un’API richiede specificamente binascii o un risultato di tipo byte; per ottenere una normale stringa di testo, bytes.hex() è più conciso. Le etichette e i risultati nell’esempio invariato restano in inglese.

Convertire i punti di codice dei caratteri con ord() e hex()

Per rappresentare il punto di codice Unicode di ogni carattere invece dei byte codificati, applica ord() a ciascun carattere e passa l’intero ottenuto a hex(). Se vuoi soltanto le cifre, rimuovi il prefisso 0x. Questa rappresentazione differisce da quella UTF-8: il punto di codice di é è e9, mentre i suoi byte UTF-8 sono c3 a9.

Concatenando le cifre dei punti di codice, i valori di larghezza variabile possono rendere poco chiari i confini. Per esempio, i punti di codice 0x41 e 0x1f600 diventano 411f600 senza separatori: così non si vede dove termina un valore e inizia l’altro. Se un altro programma deve analizzare i singoli punti di codice, mantieni i delimitatori oppure usa un padding a larghezza fissa.

Scegliere tra byte codificati e punti di codice dei caratteri

Scegli text.encode(encoding).hex() quando ti servono i byte da memorizzare, trasmettere o confrontare usando una codifica specifica. Scegli l’approccio con ord() solo quando ti servono proprio i punti di codice Unicode: non produce la sequenza di byte codificata.

La funzione integrata hex() di Python accetta un intero, non una stringa. Applicarla direttamente al testo genera TypeError. Convertire con int(value, 16) una stringa numerica che contiene già cifre esadecimali è un’operazione di parsing distinta e non serve a codificare testo arbitrario. Per la normale conversione da stringa a esadecimale, specifica la codifica e usa encode() seguito da hex().