Converti Hex in Byte in Python

Rayven Esplanada 19 settembre 2023
  1. Inizializza un Valore Esadecimale
  2. Utilizza la Funzione “bytes.fromhex()” per Convertire Hex in Byte in Python
  3. Utilizza il Modulo “binascii” per Convertire Hex in Byte in Python
  4. Utilizzare il metodo codecs.decode() per convertire un esadecimale in byte in Python
  5. Utilizzare la comprensione di lista e la funzione int() per convertire un’esadecimale in byte in Python
  6. Conclusioni
Converti Hex in Byte in Python

Esadecimale, spesso abbreviato come hex, utilizza 16 simboli (0-9, a-f) per rappresentare valori, in contrasto con i 10 simboli decimali. Ad esempio, 1000 in decimale è 3E8 in hex.

La padronanza della gestione di hex è fondamentale per le attività di programmazione che coinvolgono dati binari, indirizzi di memoria e codifica a basso livello. Questo tutorial introduce come convertire valori esadecimali in un byte letterale in Python.

Inizializza un Valore Esadecimale

Creiamo un valore esadecimale utilizzando una stringa e convertiamo la frase “A quick brown fox” in un valore esadecimale utilizzando la funzione “hexlify()” nel modulo “binascii”.

Per convertire una stringa in esadecimale, è prima necessario convertire la stringa in byte.

import binascii

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

print(hex_val)

Output:

4120717569636b2062726f776e20666f78

Abbiamo convertito con successo una stringa in esadecimale. Ora procediamo a convertire nuovamente l’esadecimale in byte.

Utilizza la Funzione “bytes.fromhex()” per Convertire Hex in Byte in Python

Il metodo “bytes.fromhex()” è progettato per convertire una stringa esadecimale valida in un oggetto “bytes”. Ha la seguente sintassi:

bytes.fromhex(hex_string)
  • “hex_string”: Questo è un argomento obbligatorio e rappresenta la stringa esadecimale di input che si desidera convertire in un byte letterale.

Ecco come funziona il metodo “bytes.fromhex()”:

  1. Validazione dell’input: Il metodo prima convalida l’input “hex_string” per assicurarsi che contenga solo caratteri esadecimali validi (cifre 0-9 e lettere minuscole o maiuscole A-F). Se la stringa contiene altri caratteri, verrà sollevato un “ValueError”.
  2. Elaborazione delle coppie: Il metodo elabora la stringa esadecimale due caratteri alla volta, trattando ogni coppia di caratteri come un singolo byte esadecimale. Ciò significa che per ogni due caratteri nella stringa di input, viene generato un byte nell’oggetto “bytes” risultante.
  3. Conversione in Byte: Ogni coppia di caratteri esadecimali viene convertita nel suo equivalente binario.
  4. Costruzione dell’oggetto “bytes”: Mentre il metodo elabora le coppie di caratteri esadecimali, costruisce un oggetto “bytes” aggiungendo la rappresentazione binaria di ogni byte. Questo processo continua fino a quando l’intera stringa di input è stata elaborata.
  5. Valore di Ritorno: Una volta che l’intera stringa di input è stata elaborata, il metodo restituisce l’oggetto “bytes” risultante, che rappresenta l’equivalente byte letterale della stringa esadecimale di input.

Come esempio, prenderemo il valore esadecimale dal risultato precedente e utilizzeremo “fromhex()” per convertirlo in un byte letterale.

hex_val = "4120717569636b2062726f776e20666f78"

print(bytes.fromhex(hex_val))

Output:

b'A quick brown fox'

Analizziamo la stringa esadecimale di esempio “4120717569636b2062726f776e20666f78” per comprendere meglio come viene convertita in un byte letterale:

  • “41” diventa il byte 65 (valore ASCII di “A”).
  • “20” diventa il byte 32 (valore ASCII dello spazio).
  • “71” diventa il byte 113 (valore ASCII di “q”).
  • “75” diventa il byte 117 (valore ASCII di “u”).
  • “69” diventa il byte 105 (valore ASCII di “i”).
  • “63” diventa il byte 99 (valore ASCII di “c”).
  • “6b” diventa il byte 107 (valore ASCII di “k”).
  • “20” diventa il byte 32 (valore ASCII dello spazio).
  • “62” diventa il byte 98 (valore ASCII di “b”).
  • “72” diventa il byte 114 (valore ASCII di “r”).
  • “6f” diventa il byte 111 (valore ASCII di “o”).
  • “77” diventa il byte 119 (valore ASCII di “w”).
  • “6e” diventa il byte 110 (valore ASCII di “n”).
  • “20” diventa il byte 32 (valore ASCII dello spazio).
  • “66” diventa il byte 102 (valore ASCII di “f”).
  • “6f” diventa il byte 111 (valore ASCII di “o”).
  • “78” diventa il byte 120 (valore ASCII di “x”).

Quando tutti questi byte vengono combinati, si ottiene il byte letterale “A quick brown fox”, che è il risultato finale.

Utilizza il Modulo “binascii” per Convertire Hex in Byte in Python

Il modulo Python “binascii” contiene funzioni di utilità efficienti per operazioni binarie e ASCII. In particolare, “unhexlify()” è una funzione all’interno del modulo “binascii” che converte un valore esadecimale in un byte letterale.

Questa funzione ha la seguente sintassi:

binascii.unhexlify(hex_string)
  • “hex_string”: Questo è l’argomento obbligatorio che rappresenta la stringa esadecimale di input che si desidera convertire in un byte letterale.

Ecco una spiegazione dettagliata di come funziona:

  1. Validazione dell’input: Il metodo inizia con la convalida dell’argomento “hex_string” per assicurarsi che contenga solo caratteri esadecimali validi. Eventuali caratteri non validi nella stringa di input comporteranno un’eccezione di “binascii.Error”.
  2. Conversione delle Coppie Esadecimali: Successivamente, il metodo elabora la “hex_string” in coppie di caratteri. Ad esempio, “41” rappresenta il byte con il valore intero 65 (valore ASCII di “A”).
  3. Conversione in byte: Le coppie di byte esadecimali vengono convertite nella loro rappresentazione binaria. Ogni coppia viene trasformata in un byte corrispondente, con ogni carattere che rappresenta 4 bit.
  4. Costruzione del valore letterale di byte: Mentre il metodo elabora ogni coppia, aggiunge i byte binari risultanti per formare un completo valore letterale di byte. Questo processo continua finché l’intera stringa di input non è stata elaborata.
  5. Valore di ritorno: Una volta che l’intera hex_string è stata elaborata, la funzione unhexlify() restituisce il valore letterale di byte risultante, rappresentato come un oggetto bytes.

Iniziamo inizializzando un nuovo esempio con caratteri speciali non ASCII, che verranno poi convertiti in un valore esadecimale. L’esempio sarà la traduzione in greco della frase 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))

Output:

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'

Abbiamo ora convertito con successo i valori esadecimali in byte.

Utilizzare il metodo codecs.decode() per convertire un esadecimale in byte in Python

La funzione codecs.decode() può anche essere utilizzata per convertire una stringa esadecimale in byte. Fa parte del modulo codecs di Python, che fornisce varie funzionalità di codifica e decodifica per diverse rappresentazioni di dati.

Ha la seguente sintassi:

codecs.decode(data, encoding, errors="strict")
  • data: Questo è l’argomento obbligatorio che rappresenta i dati che si desidera decodificare. In questo caso, dovrebbe essere la stringa esadecimale che si desidera convertire in un valore letterale di byte.
  • encoding: Questo è anche un argomento obbligatorio che specifica la codifica da utilizzare per la decodifica. Quando si lavora con stringhe esadecimali, si dovrebbe utilizzare la codifica hex per indicare che la stringa di input rappresenta un valore esadecimale.
  • errors (opzionale): Questo argomento specifica come gestire gli errori di decodifica, ad esempio quando la stringa di input contiene caratteri non validi per la codifica specificata. Ha un valore predefinito di strict, ma è possibile cambiarlo in ignore o replace per gestire gli errori in modo diverso.

Ecco una spiegazione dettagliata di come funziona questo metodo quando viene utilizzato per decodificare valori esadecimali:

  1. Convalida dell’input: Il metodo controlla prima la validità dell’argomento data per assicurarsi che contenga solo caratteri esadecimali validi. Se la stringa di input contiene caratteri non esadecimali, solleverà un’eccezione UnicodeDecodeError con dettagli sul carattere problematico.
  2. Processo di decodifica: La funzione codecs.decode() interpreta l’argomento data come una stringa esadecimale e la converte in dati binari. Elabora la stringa di input a coppie di caratteri, trattando ogni coppia come un singolo byte esadecimale.
  3. Specifica di codifica: L’argomento encoding è cruciale in questo contesto. Quando si specifica hex come codifica, si indica a Python di interpretare la stringa di input come un valore esadecimale e di convertirlo di conseguenza.
  4. Conversione in byte: Mentre il metodo elabora ogni coppia di caratteri esadecimali, li converte nella loro rappresentazione binaria. Questa trasformazione porta alla creazione di un valore letterale di byte, dove ogni coppia di caratteri corrisponde a un singolo byte.
  5. Valore di ritorno: Il metodo codecs.decode() restituisce il valore letterale di byte risultante come oggetto bytes, che rappresenta i dati binari decodificati.

Guarda l’esempio qui sotto:

import codecs

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

Questo programma decodifica la stringa hex_val utilizzando la funzione codecs.decode() con l’argomento encoding impostato su hex. Ciò significa che interpreterà la stringa di input come un valore esadecimale e lo convertirà in byte.

Output:

b'A quick brown fox'

Utilizzare la comprensione di lista e la funzione int() per convertire un’esadecimale in byte in Python

Questo metodo coinvolge l’uso della comprensione dell’elenco e della funzione int() per convertire una stringa esadecimale in byte.

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)

Qui, il codice utilizza una comprensione di lista per iterare sulla stringa esadecimale a coppie di due caratteri, converte ogni coppia in un intero in base 16 (esadecimale) e crea un elenco di questi interi.

Il costruttore bytes() viene quindi utilizzato per convertire questo elenco di interi in un oggetto di byte.

Output:

b'A quick brown fox'

Questo metodo è particolarmente utile quando si ha una stringa esadecimale con una struttura nota e si desidera convertirla efficacemente in byte. Fornisce un controllo sul processo di conversione consentendoci di specificare la base di codifica (in questo caso base 16 per esadecimale).

Conclusioni

In questo articolo, abbiamo esaminato alcuni modi per convertire valori esadecimali in valori letterali di byte in Python.

La funzione fromhex() è preferibile se non si desidera aggiungere importazioni al proprio codice sorgente. In caso contrario, è possibile scegliere il metodo che meglio si adatta alle proprie esigenze e al proprio stile di programmazione.

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

Articolo correlato - Python Bytes

Articolo correlato - Python Hex