Codificare in esadecimale

Incolla del testo e leggi i byte di cui è fatto. Due cifre esadecimali per byte, con il separatore in uso dove andrai a scriverli — spazi per un dump, due punti per l’impronta di un certificato, niente per un campo di database. La codifica è sempre UTF-8, ed è il motivo per cui una lettera accentata dà due byte e non uno.

Risultato

La risposta compare qui mentre scrivi.

  • Dove gira

    Non viene caricato nulla, perché non c’è nessun file: il calcolo avviene in questa pagina.

  • Nessuna coda, nessun account

    Risponde alla velocità della tua macchina e non chiede mai chi sei.

  • Tutte le volte che vuoi

    Non si conta né si limita nulla: rispondere di nuovo non ci costa niente.

Come funziona

  1. Incolla il testo.
  2. Scegli il separatore e il caso delle cifre come se li aspetta l’altra parte.
  3. Copia i byte. Il testo non è uscito dalla tua macchina.

Un byte sono due cifre; un carattere no

L’esadecimale ha sedici simboli, quindi ogni cifra copre quattro bit e due cifre coprono esattamente un byte. È una corrispondenza perfetta ed è tutta la ragione per cui questa notazione esiste: leggere un byte in binario richiede otto simboli, in decimale richiede un numero variabile, in esadecimale sempre due.

Un carattere invece non ha una lunghezza fissa. In UTF-8 le lettere dell’alfabeto inglese occupano un byte, le accentate due, la maggior parte dei simboli tre, gli emoji quattro. Contare i byte di un dump e credere di aver contato i caratteri è l’errore che porta a troncare una stringa in mezzo a una lettera.

Perché sempre UTF-8

Perché è quello che c’è. Il web è UTF-8 per specifica, i file di testo prodotti dagli strumenti moderni sono UTF-8, e un dump prodotto in un’altra codifica va interpretato conoscendo quale, cosa che nessuna stringa dichiara di per sé.

Il caso che ancora capita in Italia è Latin-1, cioè ISO 8859-1, ereditato da vecchi database e da qualche export contabile: lì una `à` è un byte solo, `e0`. Se il tuo dump ha `e0` dove ti aspetti una lettera accentata, non è UTF-8, e quella è già la diagnosi: la stringa viene da un sistema che non è mai stato convertito.

I separatori non sono una questione di gusto

Ogni ambiente ha la sua convenzione, e sono tutte in uso contemporaneamente. Gli spazi sono la forma dei dump prodotti dagli editor esadecimali; i due punti sono la forma delle impronte di certificato e degli indirizzi MAC; nessun separatore è la forma di un campo di database, di un hash o di un letterale in un file sorgente; le virgole servono per incollare in un array.

La scelta non cambia i dati e cambia se l’altra parte li accetta. Vale la pena sceglierla guardando dove il valore andrà a finire, perché convertire un dump da una forma all’altra a mano è il tipo di lavoro noioso in cui si perde un byte senza accorgersene.

Maiuscole o minuscole, e dove conta

`c3` e `C3` sono lo stesso byte, quindi la scelta è puramente di scrittura. Le minuscole sono la convenzione degli strumenti Unix e della maggior parte dei formati moderni; le maiuscole compaiono nelle impronte dei certificati e in parecchi strumenti Windows.

Diventa una differenza vera in un posto solo: il confronto testuale. Due sistemi che scrivono lo stesso hash in due casi diversi producono un mancato riscontro, ed è un difetto che si presenta come «i dati non corrispondono» invece che come «la scrittura è diversa». Un confronto fra valori esadecimali va fatto senza distinzione di caso, sempre.

Guardare i caratteri invisibili

È l’uso più utile di questa pagina. Due stringhe che sullo schermo sono identiche e che un confronto dichiara diverse contengono quasi sempre qualcosa che non si vede, e in esadecimale quel qualcosa diventa evidente.

I sospettati abituali sono tre. `c2 a0` è lo spazio unificatore, che arriva da un copia-incolla da una pagina web o da un documento di videoscrittura. `ef bb bf` all’inizio è il BOM, lasciato da un editor Windows. E `e2 80 99` è l’apostrofo tipografico, quello che Word e i telefoni producono al posto di quello dritto: è tre byte invece di uno, e in italiano compare praticamente in ogni frase, il che lo rende la causa numero uno delle stringhe che sembrano uguali e non lo sono.

I fine riga che separano due sistemi

Un ritorno a capo è `0a` su Linux e su macOS, e `0d 0a` su Windows. Non si vedono in nessun editor, e sono la spiegazione più frequente di due file che dovrebbero essere identici e hanno hash diversi.

La differenza si accumula: su un file di mille righe sono mille byte. È anche il motivo per cui Git ha un’opzione di conversione automatica dei fine riga, e per cui quell’opzione crea problemi propri quando è impostata in modo diverso su due macchine dello stesso progetto. Vedere `0d 0a` in un dump è la conferma che serve prima di andare a cercare altrove.

Esadecimale e Base64 risolvono problemi diversi

L’esadecimale è fatto per essere letto: due cifre per byte, corrispondenza diretta, si può contare con un dito sullo schermo. Il prezzo è la dimensione, perché occupa il doppio dell’originale.

Il Base64 è fatto per essere trasportato: occupa un terzo in più invece del doppio, e in cambio è illeggibile — non c’è nessun modo di guardare una stringa Base64 e dire quale byte sta in quinta posizione. La regola pratica segue da qui: esadecimale quando devi guardare i byte, Base64 quando devi spedirli.

Cosa significa 0x e dove va

Il prefisso `0x` è una convenzione dei linguaggi di programmazione per dire che il numero che segue è in base sedici, e riguarda un numero singolo: `0x41` è il numero 65. Non è parte della notazione dei byte.

Per questo un dump non si scrive con `0x` davanti a ogni byte, ed è un errore comune quando si copia un valore da un debugger. Il prefisso serve dove c’è un valore solo — un colore, una maschera di bit, un punto di codice — e in un dump di trenta byte produce sessanta caratteri di rumore. Questa pagina non lo aggiunge; la pagina di decodifica lo accetta lo stesso, perché con i dump copiati da un debugger capita.

Guardare i byte non richiede un server

Quello che si porta a un codificatore esadecimale è spesso un valore che sta dando problemi: una stringa presa da un database, il nome di un cliente con un carattere strano dentro, una chiave che non corrisponde. Sono dati reali, guardati proprio perché qualcosa non torna.

La conversione è aritmetica su ogni byte e avviene nella scheda: non parte nessuna richiesta e nel senso del GDPR non c’è nessuna comunicazione da giustificare. È anche il motivo per cui la pagina funziona su una macchina scollegata dalla rete, che è esattamente la situazione in cui si guardano i byte di qualcosa.

Codificare in esadecimale: domande frequenti

Perché le lettere accentate occupano due byte?

Perché in UTF-8 la lunghezza dipende dal carattere: le lettere inglesi ne occupano uno, quelle accentate due, la maggior parte dei simboli tre, gli emoji quattro. Una à è `c3 a0`. In Latin-1 sarebbe un byte solo, `e0`, ed è per questo che un dump va sempre letto sapendo da quale codifica proviene.

Quale separatore è quello giusto?

Dipende da dove finisce il valore. Spazi per un dump da leggere, due punti per un’impronta di certificato o un indirizzo MAC, niente per un campo di database o un hash, virgole per incollare in un array. I dati sono gli stessi in tutti e quattro i casi; a cambiare è solo se l’altra parte li accetta.

Il caso delle cifre fa differenza?

Per i dati no: `c3` e `C3` sono lo stesso byte. Fa differenza per un confronto testuale, dove due sistemi che scrivono lo stesso valore in casi diversi producono un mancato riscontro che sembra un problema di dati. Un confronto fra valori esadecimali va sempre fatto senza distinzione di caso.

Come faccio a vedere se il mio testo contiene uno spazio unificatore?

Incollalo qui e cerca `c2 a0`: lo spazio normale è `20`. Con lo stesso metodo si riconoscono il BOM, che è `ef bb bf` all’inizio, e l’apostrofo tipografico, che è `e2 80 99` invece del singolo `27`. Sono le tre cause più comuni di due stringhe identiche a vedersi e diverse a confrontarsi.

Il testo esce dalla mia macchina?

No. La conversione è aritmetica su ogni byte e avviene nella pagina, quindi non parte nessuna richiesta. La pagina funziona anche senza rete, che è spesso la situazione in cui si va a guardare i byte di qualcosa.

Altri strumenti