Convertitore da testo a esadecimale
Converti il testo in esadecimale — i suoi byte UTF-8 o UTF-16, con spazi, come array, con escape o come dump — e rileggi come testo ognuna di queste forme.
43 69 61 6F
Una stringa vista come i byte in cui è memorizzata
Ogni stringa che un programma gestisce è, sotto, una fila di byte, e questa pagina li scrive in esadecimale, due cifre ciascuno. Scrivi Hello e ottieni 48 65 6C 6C 6F, un byte per lettera, con uno spazio dopo ognuno tranne l’ultimo. Imposta invece la direzione su «Da esadecimale a testo» e incolla l’esadecimale preso da un log, da un database o da un debugger, e ottieni il testo che quei byte contengono.
Uno stesso testo produce byte diversi in codifiche diverse, ed è l’unità a decidere che cosa sono le cifre di questa pagina. L’unità parte da UTF-8, la codifica del web, dove H è il byte 48 e א i byte D7 90. UTF-16 LE e UTF-16 BE spendono due byte per ciascuno dei due, in ordini opposti — 48 00 o 00 48 per H — mentre «Punti di codice» lascia del tutto da parte i byte e scrive il numero che Unicode assegna, U+05D0 per א. Qualunque unità sia impostata vale per l’esadecimale che leggi quanto per il testo che scrivi, e resta impostata: se l’esadecimale incollato somiglia a quello di un’altra unità, la pagina può suggerire quella, ma solo un tuo clic cambia l’unità.
Due cifre esadecimali per ogni byte
Un byte contiene uno di 256 valori, da 0 a 255. L’esadecimale conta per sedici, con le cifre da 0 a 9 e poi da A a F per i valori da dieci a quindici, e sedici volte sedici fa 256, quindi due cifre esadecimali danno un nome a ogni byte e una terza non serve mai: 00 è 0, 7F è 127 e FF è 255. H è 72, cioè quattro volte sedici più otto, quindi il suo byte è 48.
Ogni cifra esadecimale corrisponde esattamente a quattro bit, mezzo byte: il 4 di 48 è 0100 e l’8 è 1000, e affiancati sono gli otto bit di H, 01001000. La pagina tiene entrambe le cifre di ogni byte, quindi un avanzamento di riga è 0A e uno spazio 20, e poiché ogni byte occupa la stessa larghezza, l’esadecimale si può rileggere senza niente tra i byte: 4869 è Hi.
Le lettere in esadecimale significano la stessa cosa sia maiuscole sia minuscole. La pagina scrive in maiuscolo a meno che tu non scelga «minuscolo», quindi la é diventa C3 A9 oppure c3 a9, e la lettura accetta entrambe le forme, anche mescolate nello stesso testo incollato.
Cinque stili, ciascuno pensato per dove verrà incollato
In esadecimale, il controllo «Stile» dispone gli stessi byte in cinque modi, ciascuno per un posto dove l’esadecimale va dopo. Per Hi, i due byte 48 e 69:
- «Con spazi» dà 48 69, uno spazio tra i byte: il più facile da leggere e da contare, e lo stile con cui la pagina si apre.
- «Compatto» dà 4869, le cifre attaccate, per un campo o un parametro che accetta un valore come un’unica stringa esadecimale.
- «Array» dà 0x48, 0x69, ogni byte un numero preceduto da 0x e una virgola in mezzo, il tutto pronto da incollare in un array di byte in C, C#, JavaScript, Python o Go.
- «Con escape» dà \x48\x69, ogni byte come \x seguito dalle sue due cifre, il modo in cui si scrive un byte dentro una stringa C o un letterale di byte Python come b'\x48\x69'.
- «Dump esadecimale» dispone i byte in righe, con il punto in cui inizia ogni riga e gli stessi byte come testo accanto: la sezione successiva ne legge uno.
La lettura riprende tutti e cinque, insieme ad altre formattazioni che lasciano stare i byte: i due punti come in 48:69, i trattini che scrive BitConverter.ToString di .NET, come in 48-69, 0x o 0X davanti a ogni byte, e il testo incollato racchiuso per intero, una volta, tra parentesi tonde, quadre o graffe o tra virgolette. Lo stile e la scelta tra maiuscole e minuscole contano solo per la scrittura, quindi entrambi i controlli spariscono quando la direzione è «Da esadecimale a testo».
Una trappola si nasconde in «Con escape». In una stringa JavaScript, o in una normale stringa Python anziché in un letterale di byte, \x indica un carattere e non un byte, quindi lì \xD7\x90 sono due caratteri e non la א i cui byte UTF-8 sono D7 90. Oltre l’ASCII, affida i byte a qualcosa che accetta byte.
Leggere un dump esadecimale, colonna per colonna
Un dump esadecimale dispone i byte sedici per riga, con una colonna su ciascun lato per aiutarti a ritrovarli. Scritti come «Dump esadecimale», Hello, World! e un avanzamento di riga riempiono una riga: prima 00000000, lo scostamento, cioè la posizione del primo byte della riga contata da zero, in otto cifre esadecimali; poi i quattordici byte, otto e poi sei, con uno spazio più largo tra le due metà; poi |Hello, World!.|, gli stessi byte come caratteri, con ogni byte che non è ASCII stampabile mostrato come un punto, avanzamento di riga compreso. Un’ultima riga contiene solo 0000000E, cioè quattordici: dove starebbe il byte successivo, e quindi la lunghezza. È la disposizione che stampa hexdump -C.
- Con «Da esadecimale a testo» scelto e qualunque unità tranne «Punti di codice», un dump esadecimale incollato viene letto soltanto per i suoi byte: la colonna di testo resta fuori dalla lettura, nessuno scostamento viene letto come un byte, e un avviso sotto il risultato dice che l’input è stato preso per un dump e nomina la disposizione.
- Le disposizioni lette così sono due: quella di hexdump -C, e ciò che stampa xxd senza opzioni, dove dopo ogni scostamento vengono i due punti e i byte stanno in gruppi di quattro cifre. L’esadecimale semplice che stampa xxd -p non ha bisogno di alcuna disposizione e si legge come qualunque altro esadecimale.
- hexdump -C stampa una riga con il solo * al posto delle righe che ripetono quella sopra, e la pagina ricostruisce quelle righe a partire dallo scostamento della riga sotto, così i byte tornano completi.
- Ogni scostamento dopo il primo deve derivare dai byte sopra di esso, compresa la lunghezza sull’ultima riga di hexdump -C, e una riga il cui scostamento non torna viene rifiutata lì anziché letta in modo sbagliato: è lì che si vede una riga saltata, un byte perso o uno scostamento scritto male. Ciò che nessuno scostamento segue non si può controllare, quindi un dump esadecimale a cui mancano le prime righe, o la fine di un dump senza una riga della lunghezza dopo di essa — xxd non ne scrive —, si legge come ciò che resta.
UTF-16 LE, e perché un byte su due è 00
Windows conserva il testo in UTF-16 con il byte meno significativo per primo, cioè UTF-16 LE; in .NET è Encoding.Unicode, e SQL Server memorizza un valore NVARCHAR nello stesso modo. UTF-16 dà due byte a ogni carattere fino a U+FFFF, e per tutto ciò che arriva fino a U+00FF — le lettere dell’alfabeto inglese, le cifre, é e il resto del Latin-1 — il byte più significativo è 00. Con il byte meno significativo per primo, quello zero cade dopo ogni lettera: Hi è 48 00 69 00.
SQL Server mostra un valore VARBINARY come 0x seguito dal suo esadecimale, quindi un NVARCHAR che contiene Hi, convertito in VARBINARY, appare come 0x48006900. Incollalo qui mentre è scelto UTF-8 e il testo esce come H, un NUL, i e un NUL, e l’avviso sotto dice che un byte su due è 00, come in un testo in alfabeto latino scritto in UTF-16 anziché in UTF-8, con «Passa a UTF-16 LE» accanto. Premilo e gli stessi byte si leggono Hi.
UTF-16 BE mette invece per primo il byte più significativo, quindi lì Hi è 00 48 00 69, e א, D0 05 in UTF-16 LE, è 05 D0. Gli zeri al primo posto di ogni coppia fanno sì che l’avviso proponga UTF-16 BE. L’avviso non dice nulla appena nel testo c’è un carattere oltre U+00FF, perché il byte più significativo di quel carattere non è 00, e parla soltanto dove un byte su due è 00.
Un contrassegno di ordine dei byte all’inizio
Un testo può iniziare con U+FEFF, un carattere che non mostra nulla e che sta lì per fare da contrassegno di ordine dei byte. In UTF-16 i suoi due byte danno l’ordine di ogni coppia che segue, FF FE per UTF-16 LE e FE FF per UTF-16 BE, e in UTF-8 sono i tre byte EF BB BF, una firma che indica che il testo è UTF-8 — una codifica che ha un solo ordine.
La pagina conserva un contrassegno anziché scartarlo. L’esadecimale che inizia con il contrassegno proprio dell’unità scelta si legge come un testo che inizia con U+FEFF, e un avviso dice che il contrassegno è stato conservato, così riscrivere quel testo dà gli stessi byte, contrassegno compreso. L’esadecimale che inizia con il contrassegno dell’altro ordine UTF-16, o con un contrassegno UTF-16 mentre è scelto UTF-8, riceve un avviso che dice che i byte iniziano con il contrassegno di un’altra unità, accanto a un pulsante che passa all’ordine indicato dal contrassegno. In qualunque punto dopo l’inizio, U+FEFF è un carattere normale e non fa comparire alcun avviso.
Byte che non sono testo, mostrati come U+FFFD
Non tutte le sequenze di byte sono testo nell’unità scelta: un carattere a cui manca l’ultimo byte, un byte isolato come E9, che le vecchie tabelle codici scrivono per é, e un byte spaiato rimasto alla fine di un testo UTF-16 non compongono nulla. Una sequenza difettosa però non manda a monte tutto ciò che hai incollato: ciascuna viene sostituita con U+FFFD, il carattere sostitutivo, e tutto il resto si legge normalmente.
Un avviso dice poi quante sono e indica la prima con la sua posizione tra i byte, con le cifre che hai scritto per essa e con la sua riga e colonna. Café salvato in Windows-1252, la tabella codici di Windows per il testo dell’Europa occidentale, è 43 61 66 E9, dove é sta in un unico byte, E9; letto come UTF-8 torna come Caf e U+FFFD, e l’avviso indica il byte 4, scritto E9, alla riga 1, colonna 10. In UTF-8 la parola è 43 61 66 C3 A9.
L’avviso conta sequenze, non byte: F0 9F 98, tre dei quattro byte di 😀, sono un unico U+FFFD. E un U+FFFD che si trova davvero nel testo, i byte EF BF BD, viene letto come testo e non viene contato affatto, quindi l’avviso riguarda sempre e soltanto byte che non si sono potuti leggere.
Ritrasformare l’esadecimale in un file
La lettura consegna i byte oltre al testo. Con la direzione su «Da esadecimale a testo» e UTF-8, UTF-16 LE o UTF-16 BE scelto, «Scarica» salva, in un file chiamato bytes.bin, esattamente i byte che sono stati letti, compresi quelli che non erano testo e prima di qualunque sostituzione: il lavoro che fa xxd -r con un dump esadecimale. Per i punti di codice, che non sono byte, «Scarica» non c’è, e nemmeno durante la scrittura, quando ciò che porti via sono cifre.
Così l’esadecimale di qualcosa che non è mai stato testo torna comunque intero. Ogni immagine PNG inizia con gli otto byte 89 50 4E 47 0D 0A 1A 0A; letti come UTF-8 appaiono come U+FFFD, le lettere PNG e quattro caratteri di controllo, con un avviso sull’unica sequenza che non è testo, e «Scarica» salva tutti e otto esattamente. Il file si chiama sempre bytes.bin, perché i byte non portano un nome, quindi dagli il suo, per esempio image.png, una volta salvato.
Dove andare per un carattere, i suoi bit o un numero
Per sapere che cos’è un carattere — il suo nome, la sua categoria e se è uno di quelli invisibili — l’Ispettore di caratteri Unicode scompone un testo un punto di codice alla volta e affianca a ciascuno i suoi byte UTF-8.
Il Convertitore da testo a binario è questa stessa pagina aperta sul binario, dove lo schema seguito da UTF-8 si legge nei primi bit di ogni byte. E un numero non è un testo: 255 inserito qui sono le cifre 2, 5 e 5, e quindi i byte 32 35 35, mentre il Convertitore di basi numeriche prende 255 come una quantità e in esadecimale lo scrive ff.
Domande frequenti
- Come trasformo l’esadecimale in testo?
- Scegli «Da esadecimale a testo», incolla l’esadecimale e imposta l’unità sulla codifica in cui è stato scritto: UTF-8 per la maggior parte dei testi, UTF-16 LE per l’esadecimale preso da una stringa Windows o .NET o da una colonna NVARCHAR. Spazi, virgole, due punti e trattini tra i byte, 0x o \x davanti a essi e un unico involucro attorno al tutto vengono accettati in lettura, e lo stesso vale per maiuscole e minuscole.
- Perché c’è un NUL tra ogni lettera del mio testo?
- Molto probabilmente l’esadecimale è UTF-16 LE letto come UTF-8. UTF-16 LE scrive ogni lettera dell’alfabeto inglese in due byte, il suo valore ASCII e poi 00, e UTF-8 legge ciascuno di quegli zeri come un carattere a sé, NUL. Scegli UTF-16 LE, o premi il pulsante che ci passa se la pagina lo offre accanto al suo avviso, e le lettere si ricompattano.
- Perché le lettere accentate del mio esadecimale escono come U+FFFD?
- Molto probabilmente l’esadecimale è stato scritto in una vecchia tabella codici come Windows-1252, dove é occupa un unico byte, E9, mentre in UTF-8 si scrive C3 A9 e un E9 isolato non è testo. La pagina legge UTF-8 e UTF-16 e nessuna vecchia tabella codici, quindi, invece di indovinare quale fosse quella voluta, mostra ogni sequenza del genere come U+FFFD e dice dove si trova la prima. «Scarica» ti dà comunque i byte così com’erano.
- Posso incollare ciò che hanno stampato xxd o hexdump -C?
- Sì: la disposizione di hexdump -C, che è la stessa che scrive lo stile «Dump esadecimale», e ciò che stampa xxd senza opzioni. La colonna di testo viene messa da parte e nessuno scostamento viene letto come un byte, una riga con * viene ricostruita, e un avviso dice quale delle due disposizioni è stata letta; uno scostamento che non deriva dai byte che lo precedono ferma la lettura alla sua riga, poiché le righe non concordano più tra loro. L’esadecimale semplice di xxd -p viene letto a sua volta, come qualunque altro esadecimale, senza avviso.
- Conta se l’esadecimale è maiuscolo o minuscolo?
- Non per i byte: 4A e 4a sono lo stesso byte, J. La pagina scrive in maiuscolo a meno che tu non scelga «minuscolo», e quella scelta vale per gli scostamenti di un dump esadecimale come per i suoi byte; la lettura accetta entrambi, anche mescolati nello stesso testo incollato.
- Come recupero un file da un dump esadecimale?
- Scegli «Da esadecimale a testo» e UTF-8 o uno dei due UTF-16, incolla il dump o l’esadecimale semplice e premi «Scarica». Il file che salva, bytes.bin, contiene esattamente i byte letti da ciò che hai incollato, testo o no, quindi fa il lavoro di xxd -r; rinominalo come si chiamava.
- È sicuro incollare dell’esadecimale preso da un database di produzione o da un log?
- Sì, per quanto riguarda la conversione. Avviene sul tuo dispositivo, in qualunque direzione giri: l’esadecimale che incolli, il testo che ne risulta e qualunque file salvato da «Scarica» non vengono mai inviati da nessuna parte.
Strumenti correlati
- Convertitore da testo a binario
Il binario scrive un byte come i suoi otto bit, ed è lì che si legge lo schema di UTF-8: é diventa C3 A9 qui e 11000011 10101001 là, con il primo byte che inizia con 110 perché la lettera ne occupa due e il secondo con 10 perché la continua. Anche questa pagina offre il binario; quella si apre su di esso.
- Ispettore di caratteri Unicode
Scopri esattamente di quali caratteri è fatto un testo.
- Convertitore di basi numeriche
Scrivi 255 in questa pagina e ottieni tre byte, uno per ciascuno dei suoi caratteri: 32 35 35. Quella pagina legge 255 come un numero e converte il valore stesso, che in esadecimale è ff.
- Base64
Codifica e decodifica Base64 — supporto UTF-8 completo.