Skip to content

Convertir hexadécimal en texte (et texte en hex)

Convertissez l'hexadécimal en texte et le texte en hex. Collez l'hex sous toute forme — espacé, 0x, \x, sortie xxd ou hexdump, tableau d'octets Java ou C : ASCII, UTF-8, GBK ou UTF-16 est détecté. Dans votre navigateur.

Sans pistage Fonctionne dans le navigateur Gratuit
La conversion s'exécute entièrement dans votre navigateur — rien de ce que vous collez ne quitte cet appareil.
Essayer un exemple

Lu comme hex brut · 13 octets

    Texte
    Hello, 世界

    UTF-8 détecté automatiquement : chaque séquence multi-octets est bien formée.

    Les mêmes octets dans chaque encodage

    Encodage Lecture
    UTF-8 Décodage propre Hello, 世界
    GBK / GB18030 Décodage propre Hello, 涓栫晫
    UTF-16LE Octets non décodables 效汬Ɐ隸闧�
    UTF-16BE Octets non décodables 䡥汬漬⃤뢖�
    ISO-8859-1 Décodage propre Hello, ä¸<96>ç<95><8C>
    Les dumps hex, tableaux d'octets et messages d'erreur cités ici proviennent d'exécutions réelles de xxd, Python 3.14, Node.js 26, Go 1.27 et clang, et les formats de sortie du moteur sont testés pour vérifier qu'ils se relisent en octets d'origine. Le comportement de Java et de PHP est cité d'après la documentation officielle. — Équipe d'ingénierie Go Tools · 16 sept. 2026

    Rédigé et relu par les développeurs qui conçoivent les utilitaires d'encodage de Go Tools. Chaque valeur hex et chaque sortie citées sur cette page sont produites par le moteur de la page lui-même et vérifiées par des tests automatisés.

    Hex en ASCII : réponses rapides

    Que donne 48 65 6C 6C 6F en texte ?

    Hello En ASCII et en UTF-8, 48 est H, 65 est e, 6C est l et 6F est o.

    Combien d'octets fait un caractère chinois ?

    En général 3 octets en UTF-8, 2 en GBK 你 s'écrit E4 BD A0 en UTF-8 et C4 E3 en GBK.

    Que signifie 0D 0A ?

    CR LF (\r\n) Un retour chariot suivi d'un saut de ligne — la fin de ligne utilisée par Windows, HTTP et la plupart des jeux de commandes série.

    Comment s'écrit la lettre A en hex ?

    41 Le a minuscule vaut 61 ; les deux casses diffèrent toujours de 20.

    Qu'est-ce que la conversion hex en texte ?

    L'hexadécimal est une façon d'écrire des octets : chaque octet, de 0 à 255, s'écrit avec deux chiffres, de 00 à FF. Convertir de l'hex en texte, c'est retransformer ces octets en texte lisible, et cela implique toujours de choisir un encodage de caractères — la table qui indique quel octet, ou quelle séquence d'octets, représente quel caractère.

    Pour un texte en anglais, ce choix se voit rarement, car ASCII, UTF-8, GBK et la plupart des autres encodages s'accordent sur les octets 00 à 7F. Avec tout le reste, il se voit immédiatement. Les octets C4 E3 BA C3 sont 你好 en GBK et invalides en UTF-8, tandis que 你好 en UTF-8 s'écrit E4 BD A0 E5 A5 BD. L'hex ne porte que la moitié de l'information ; l'encodage est l'autre moitié.

    Convertir du texte en hex, c'est l'opération inverse : encoder le texte en octets, puis écrire chaque octet avec deux chiffres hex. Les développeurs s'en servent pour voir exactement ce qui passe sur une liaison série ou ce qui entre dans une colonne de base de données, pour insérer des données binaires dans du code source et pour comparer ce que deux systèmes ont réellement envoyé.

    $ echo 48656c6c6f | xxd -r -p
    Hello
    
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

    Ce que fait ce convertisseur hexadécimal

    Collez l'hex sous n'importe quelle forme

    Espacé, compact, séparé par des deux-points ou des tirets, valeurs 0x, échappements \x, encodage %, tableaux C, Go et Java, sortie signée de Arrays.toString en Java, littéraux bytes Python, Buffers Node.js, et écrans complets de xxd, hexdump -C et od. La page indique ce qu'elle a reconnu et ce qu'elle a retiré.

    Encodage détecté, raison à l'appui

    La détection automatique cherche une marque d'ordre des octets, de l'UTF-8 bien formé, de l'UTF-16, de l'ASCII pur, puis du GBK, et indique quelle règle a tranché. GBK n'est retenu que si les octets se lisent comme des caractères chinois courants : les trames binaires courtes sont signalées comme n'étant probablement pas du texte, au lieu d'être rendues en chinois absurde.

    Tous les encodages côte à côte

    Les mêmes octets sont affichés en UTF-8, GBK, UTF-16LE, UTF-16BE et ISO-8859-1, chacun marqué comme décodé proprement ou non. Quand le texte sort illisible, la bonne lecture se trouve généralement une ligne plus bas.

    Les octets invisibles rendus visibles

    NUL, CR, LF, ESC et les autres octets de contrôle sont affichés ␀ ␍ ␊ ␛ : un 00 final ou un 0D manquant dans des données de protocole saute aux yeux. La copie donne toujours les vrais caractères.

    Une sortie prête à coller dans le code

    Texte → Hex produit de l'hex espacé ou compact, des listes 0x, des échappements \x, un tableau C façon xxd -i, un byte[] Java aux valeurs signées, un littéral bytes Python identique à repr(), un []byte Go ou un dump xxd — et la page sait relire chacun d'eux.

    Rien ne quitte votre navigateur

    L'analyse et le décodage s'exécutent localement en JavaScript. Rien n'est envoyé, stocké ni placé dans l'URL : vous pouvez coller sans crainte des captures réseau et des logs de production.

    Convertir hex en texte dans le code

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8') renvoie 'Hello' ; les espaces entre octets sont acceptés, un préfixe 0x ne l'est pas. L'inverse est s.encode('utf-8').hex(), ou .hex(' ') pour une sortie espacée. Passez 'gbk' pour décoder ou encoder du texte chinois en GBK.

    JavaScript (Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8') décode, Buffer.from(s, 'utf8').toString('hex') encode. Une entrée invalide ne provoque pas d'erreur : le décodage s'arrête à la première paire invalide et un dernier chiffre isolé est ignoré, validez donc l'entrée d'abord.

    JavaScript (navigateur)

    TextDecoder / TextEncoder

    Convertissez les paires avec parseInt(pair, 16) dans un Uint8Array, puis appelez new TextDecoder('utf-8').decode(bytes). TextDecoder lit aussi 'gbk', 'big5' et 'shift_jis', mais TextEncoder ne produit que de l'UTF-8.

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) décode et HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) encode. Sur les versions antérieures, formatez chaque octet avec String.format("%02x", b) ; évitez Integer.toHexString(b), qui affiche ffffffe4 pour les octets négatifs.

    Go

    encoding/hex

    hex.DecodeString(h) renvoie les octets et string(b) en fait une chaîne ; hex.EncodeToString([]byte(s)) fait l'inverse. Le paquet est strict : des espaces renvoient invalid byte: U+0020 ' ' et une longueur impaire renvoie odd length hex string.

    C

    sscanf with %2hhx

    Parcourez la chaîne deux chiffres à la fois vers un tampon unsigned char et ajoutez un '\0' final. Pour afficher de l'hex, castez en unsigned char et utilisez %02X ; sinon, là où char est signé, les octets au-dessus de 0x7F peuvent s'afficher FFFFFFE4.

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f') renvoie Hello et bin2hex('Hello') renvoie 48656c6c6f. Le manuel indique que hex2bin() renvoie false avec un E_WARNING pour une entrée de longueur impaire ou invalide.

    Shell (xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p affiche Hello, et printf 'Hello' | xxd -p affiche 48656c6c6f. Pour encoder, utilisez printf plutôt que echo, car echo ajoute un saut de ligne final, 0a.

    C# (.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h)) décode et Convert.ToHexString(Encoding.UTF8.GetBytes(s)) encode (en majuscules, sans séparateurs). FromHexString refuse les espaces et le préfixe 0x. .NET Core et .NET 5+ sont livrés sans GBK : appelez d'abord Encoding.RegisterProvider(CodePagesEncodingProvider.Instance), puis Encoding.GetEncoding(936).

    Exemples de conversion hex en texte

    Hex UTF-8 avec des caractères chinois

    48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
    Hello, 世界

    Les sept premiers octets sont de l'ASCII pur : 48 65 6C 6C 6F donne Hello, 2C est une virgule et 20 un espace. E4 B8 96 et E7 95 8C sont des séquences UTF-8 de trois octets pour 世 et 界 — la plupart des caractères chinois occupent trois octets en UTF-8. Comme chaque séquence est bien formée, la détection automatique lit l'ensemble comme de l'UTF-8.

    Une mesure de capteur en GBK qui n'est pas de l'UTF-8 valide

    CE C2 B6 C8 3A 32 35 2E 33 A1 E6
    温度:25.3℃

    Beaucoup de périphériques série envoient le texte chinois en GBK. Ici, CE C2 est 温 et B6 C8 est 度, 3A 32 35 2E 33 est l'ASCII :25.3, et A1 E6 est le signe ℃ pleine chasse — deux octets par caractère chinois ou symbole. Lus comme de l'UTF-8, ces octets sont invalides (CE ouvre une séquence de deux octets, mais C2 n'est pas un octet de continuation) ; lus comme du GBK, ce sont des caractères courants, donc la détection automatique choisit GBK. Un convertisseur qui ne connaît que l'UTF-8 affiche ici des caractères de remplacement.

    Sortie xxd collée telle quelle

    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    Hi 你好␍␊

    C'est exactement ce qu'affiche printf 'Hi 你好\r\n' | xxd. L'offset 00000000: et la colonne de caractères à droite sont retirés avant le décodage ; s'ils étaient lus comme des données, les huit zéros à eux seuls deviendraient quatre octets NUL au début. Les deux derniers octets, 0d 0a, sont un saut de ligne Windows, affiché ␍␊.

    Un tableau d'octets Java tiré d'un log

    [-28, -72, -83, -26, -106, -121]
    中文

    Arrays.toString(bytes) affiche en décimal les octets signés de Java. Les valeurs négatives correspondent aux octets de 0x80 et plus : -28 vaut 256 − 28 = 228 = 0xE4. Les six octets E4 B8 AD E6 96 87 sont l'encodage UTF-8 de 中文.

    Texte en hex pour une commande AT série

    AT+CSQ\r\n
    41 54 2B 43 53 51 0D 0A

    Les modems et la plupart des jeux de commandes UART attendent que chaque commande se termine par un retour chariot suivi d'un saut de ligne. Une zone de texte ne produit que 0A pour Entrée : cochez Sauts de ligne en CR LF et la fin de ligne devient 0D 0A.

    De l'hex encodé deux fois

    653462646130653561356264
    e4bda0e5a5bd → 你好

    Chaque octet ici est un chiffre hexadécimal ASCII (65 est e, 34 est 4, 62 est b) : le premier décodage produit donc une autre chaîne hex. Cela arrive quand une chaîne hex est traitée comme du texte puis convertie une seconde fois. La page propose le second passage, qui donne 你好. Pour éviter les fausses alertes, elle ne le propose que si le premier résultat compte au moins 12 chiffres hex et que le second se décode en vrai texte — dates, horodatages, valeurs CRC32 et hachages MD5 ne le déclenchent pas.

    Comment convertir de l'hexadécimal en texte

    1. 1

      Collez l'hex

      Collez-le dans le champ de l'onglet Hex → Texte, sous la forme que vous avez : espacé, compact, valeurs 0x, échappements \x, tableau d'octets ou écran xxd complet. La ligne sous le champ indique comment il a été lu.

    2. 2

      Vérifiez le texte et l'encodage

      Le texte apparaît à droite, avec l'encodage détecté automatiquement et la raison de ce choix. Si la détection se trompe, le tableau en dessous montre toutes les lectures ; choisissez la bonne dans le menu Encodage.

    3. 3

      Repérez les caractères invisibles

      Les octets de contrôle comme NUL, CR et LF sont affichés ␀ ␍ ␊. Décochez Afficher les caractères invisibles pour obtenir le texte brut, puis copiez le résultat.

    4. 4

      Ou convertissez du texte en hex

      Dans l'onglet Texte → Hex, choisissez l'encodage et un format de sortie — hex espacé, valeurs 0x, tableau C, Java, Python ou Go, ou dump xxd. Cochez CR LF pour les protocoles série et réseau.

    Pourquoi la conversion hex en texte échoue

    Décoder des octets GBK en UTF-8

    Le texte chinois issu d'anciens logiciels Windows, de nombreux périphériques série et de bases de données héritées est en GBK. Le décoder en UTF-8 échoue ou remplit la sortie de caractères de remplacement. Regardez le tableau des encodages et retenez la lecture qui a du sens.

    ✗ Incorrect
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
    ✓ Correct
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'

    Utiliser charCodeAt() pour obtenir des octets en JavaScript

    charCodeAt() renvoie une unité de code UTF-16. Pour l'ASCII, elle coïncide avec l'octet : le bug n'apparaît donc qu'avec les autres caractères, où le résultat ne correspond à rien de ce qu'envoie un système UTF-8.

    ✗ Incorrect
    '你'.charCodeAt(0).toString(16)   // '4f60' — a UTF-16 code unit
    ✓ Correct
    Buffer.from('你', 'utf8').toString('hex')   // 'e4bda0' — the UTF-8 bytes

    Formater des octets signés avec Integer.toHexString en Java

    Le byte de Java est signé : les octets à partir de 0x80 sont négatifs. Integer.toHexString() travaille sur un int, affiche les valeurs négatives en hex non signé sur 32 bits et supprime les zéros de tête.

    ✗ Incorrect
    Integer.toHexString(b)        // "ffffffe4" for 0xE4, "a" for 0x0A
    ✓ Correct
    String.format("%02x", b)      // "e4", "0a"

    Faire confiance à Buffer.from() de Node.js avec un hex non vérifié

    Buffer.from(hex, 'hex') ne lève jamais d'erreur. Il s'arrête à la première paire qui n'est pas de l'hex valide et ignore un dernier chiffre isolé : une faute de frappe vous donne un buffer plus court au lieu d'une erreur.

    ✗ Incorrect
    Buffer.from('486', 'hex')      // <Buffer 48> — the 6 is silently dropped
    Buffer.from('48zz65', 'hex')   // <Buffer 48> — stops at zz
    ✓ Correct
    if (!/^([0-9a-f]{2})*$/i.test(hex)) throw new Error('invalid hex');
    Buffer.from(hex, 'hex');

    Coller un dump hexadécimal avec sa colonne d'offsets

    Un convertisseur qui se contente de retirer les espaces lit l'offset 00000000: comme des données, et la colonne de caractères comme de l'hex supplémentaire quand il le peut. Le résultat commence par des octets NUL et dérive à partir de là. Utilisez xxd -p pour obtenir de l'hex brut, ou collez le dump ici, où les colonnes sont reconnues.

    ✗ Incorrect
    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    → read naively: 00 00 00 00 48 69 20 e4 …
    ✓ Correct
    $ printf 'Hi 你好\r\n' | xxd -p
    486920e4bda0e5a5bd0d0a

    Envoyer LF quand le périphérique attend CR LF

    Les modems AT et de nombreux protocoles orientés ligne terminent chaque commande par un retour chariot suivi d'un saut de ligne. Une commande qui se termine par 0A seul est souvent ignorée sans la moindre erreur.

    ✗ Incorrect
    41 54 2B 43 53 51 0A      AT+CSQ followed by LF only
    ✓ Correct
    41 54 2B 43 53 51 0D 0A   AT+CSQ followed by CR LF

    Quand convertir de l'hex en texte

    Débogage série et UART
    Les terminaux série affichent les données reçues en hex. Collez une trame pour lire le texte qu'elle contient et repérer le 0D 0A ou le 00 final — ou faites l'inverse pour construire une commande, avec des fins de ligne CR LF, qu'un périphérique acceptera.
    Lire des captures réseau
    Les charges utiles de protocole copiées depuis Wireshark ou tcpdump sont en hex. Décoder une ligne de requête, un corps JSON ou un nom d'appareil dans une trame va plus vite ici qu'en écrivant un script, et rien ne quitte votre machine.
    Tableaux d'octets dans les logs applicatifs
    Java journalise les tableaux d'octets en décimal signé, Python sous forme de littéraux b'...' et Node.js sous forme de <Buffer ...>. Collez le fragment de log tel quel pour voir le texte, et savoir s'il était en UTF-8 ou en GBK.
    Colonnes hex et BLOB en base de données
    Les outils de base de données affichent les colonnes binaires en hex. Décodez une valeur pour vérifier ce qui a réellement été stocké, ou convertissez du texte en hex pour le comparer octet par octet avec le contenu de la base.
    Chaînes dans le firmware et le code C
    Le code embarqué conserve le texte dans des tableaux d'octets. Transformez une chaîne en tableau C prêt à coller, ou relisez comme du texte un tableau tiré d'un fichier d'en-tête pour confirmer ce que l'appareil affichera.

    Comment l'hex correspond au texte : ASCII, UTF-8, GBK et UTF-16

    Deux chiffres hex par octet
    Un octet contient 8 bits et un chiffre hex en représente 4 : chaque octet fait donc exactement deux chiffres hex, de 00 à FF, et le nombre d'octets est toujours la moitié du nombre de chiffres. Majuscules et minuscules ont le même sens. Séparateurs, préfixes et syntaxe de tableau ne sont que de la notation : 4865, 48 65, 0x48, 0x65 et \x48\x65 sont les deux mêmes octets.
    ASCII : les octets sur lesquels tous les encodages s'accordent
    L'ASCII attribue les valeurs 00 à 7F. Les caractères imprimables vont de 20 (espace) à 7E (~) ; le reste sont des caractères de contrôle, dont 00 (NUL), 09 (tabulation), 0A (saut de ligne), 0D (retour chariot) et 1B (échappement) sont les plus fréquents dans les données réelles. UTF-8, GBK et ISO-8859-1 conservent tous ces valeurs, ce qui explique qu'un texte en anglais simple survive à presque n'importe quel mauvais encodage.
    UTF-8 : un à quatre octets par caractère
    L'UTF-8 écrit l'ASCII sur un seul octet et tous les autres caractères sous forme de séquence. Le premier octet annonce la longueur — C2DF pour deux octets, E0EF pour trois, F0F4 pour quatre — et chaque octet suivant doit être dans la plage 80BF. C'est cette structure stricte qui fait qu'une phrase GBK n'est presque jamais de l'UTF-8 valide — lors de notre test sur 33 910 phrases chinoises, 55 l'étaient — et qui explique que la détection automatique fasse confiance à un décodage UTF-8 propre. Un caractère chinois isolé, c'est différent : environ 18 % des caractères GBK forment par hasard une séquence UTF-8 valide de deux octets.
    GBK : deux octets par caractère chinois
    GBK conserve l'ASCII sur un octet et encode les caractères chinois et la ponctuation pleine chasse sur deux : un octet de tête de 81 à FE suivi d'un octet de queue de 40 à FE, 7F exclu. Comme la plage de l'octet de queue est très large, un texte UTF-8 court lu en GBK se décode souvent sans la moindre erreur en caractères sans rapport — E4 BD A0 E5 A5 BD (你好) devient 浣犲ソ —, c'est pourquoi cette page essaie d'abord l'UTF-8. GB18030 étend GBK avec des séquences de quatre octets pour les caractères plus rares ; le décodage de cette page les accepte.
    UTF-16 et ordre des octets
    L'UTF-16 utilise deux octets par caractère (quatre pour les caractères hors du plan multilingue de base), et ces deux octets peuvent venir dans un ordre ou dans l'autre. L'UTF-16LE place l'octet de poids faible en premier — A s'écrit 41 00 — et l'UTF-16BE l'octet de poids fort en premier — 00 41. Les API Windows et de nombreux fichiers utilisent le little-endian et peuvent commencer par une marque d'ordre des octets, FF FE ; les fichiers UTF-8 commencent parfois par EF BB BF. La détection automatique retire la marque d'ordre des octets et le signale.

    Convertir entre hex et texte de façon fiable

    Nommez l'encodage des deux côtés
    L'hex seul ne dit pas quel encodage l'a produit. Partout où du texte est transformé en octets — getBytes(), encode(), un réglage de terminal série, le charset d'une connexion à la base de données — fixez l'encodage explicitement et notez-le à côté de l'hex, pour que l'autre côté n'ait pas à deviner.
    Travaillez sur des octets, pas sur des codes de caractères
    Les fonctions qui renvoient des codes de caractères, comme charCodeAt() en JavaScript ou les valeurs char en Java, donnent des unités de code UTF-16 et non des octets encodés. Encodez d'abord la chaîne avec TextEncoder, Buffer.from() ou getBytes(StandardCharsets.UTF_8), puis formatez les octets.
    Complétez toujours chaque octet à deux chiffres
    Utilisez %02x ou un équivalent, jamais un simple appel de conversion nombre vers hex. a et 0a se ressemblent dans un log, mais concaténer des valeurs non complétées produit une chaîne de longueur impaire ou, pire, une chaîne qui se décode en d'autres octets.
    Gardez les mêmes séparateurs dans un même log
    Choisissez un format pour les logs et les traces, par exemple des paires séparées par des espaces, et tenez-vous-y. Les formats mélangés sont faciles à lire pour un humain et faciles à mal interpréter pour un script, surtout quand certaines valeurs sont complétées et d'autres non.
    Vérifiez le nombre d'octets
    Avant de vous fier à une conversion, comparez le nombre d'octets à ce que vous attendez : le champ de longueur d'un en-tête de protocole, la taille de la colonne ou la taille du fichier. La page affiche ce nombre dans les deux sens.

    FAQ : convertir hexadécimal en texte

    Comment convertir de l'hexadécimal en texte ?
    Collez l'hex dans le champ de l'onglet Hex → Texte ; le texte apparaît immédiatement. À la main, il faut deux étapes. D'abord, découpez l'hex en paires : chaque paire de chiffres hexadécimaux est un octet, de 00 à FF, donc 48656c6c6f correspond aux cinq octets 48, 65, 6C, 6C, 6F. Ensuite, décodez ces octets avec un encodage de caractères. En ASCII et en UTF-8, 48 est H, 65 est e, 6C est l et 6F est o, ce qui donne Hello. C'est à la seconde étape que les résultats divergent : les octets au-dessus de 7F désignent des caractères différents en UTF-8, en GBK et dans d'autres encodages, c'est pourquoi cette page détecte l'encodage et affiche toutes les lectures côte à côte.
    Pourquoi mon hex se transforme-t-il en caractères illisibles ?
    Presque toujours parce que les octets sont décodés avec le mauvais encodage. Le texte chinois est le cas d'école : C4 E3 BA C3 est 你好 en GBK mais de l'UTF-8 invalide, et E4 BD A0 E5 A5 BD est 你好 en UTF-8 mais devient 浣犲ソ une fois lu en GBK. Regardez le tableau des encodages sous le résultat : la ligne qui se lit comme un texte sensé correspond à l'encodage dans lequel les données ont été écrites. Avec un ou deux caractères seulement, la détection automatique ne peut pas toujours trancher : D2 BB est de l'UTF-8 valide (һ) et aussi du GBK (一), vérifiez donc la ligne GBK que la page affiche sous le résultat. Deux autres causes méritent d'être écartées : un chiffre hex en trop ou manquant, qui décale tous les octets suivants d'un demi-octet, et un dump hexadécimal collé avec sa colonne d'offsets. Si vous avez déjà du texte illisible (comme 浣犲ソ) et non de l'hex, collez plutôt ce texte dans le convertisseur d'encodage.
    Pourquoi des données série sont-elles illisibles en texte mais correctes en hex ?
    Si l'hex est juste, le débit en bauds, les bits de données et la parité sont bons — s'ils étaient faux, ce sont les octets eux-mêmes qui changeraient. Le problème se situe à l'étape qui transforme les octets en caractères, et il vient généralement de l'une de ces trois causes. Les données ne sont peut-être pas du texte du tout : un protocole binaire comme Modbus RTU n'a de sens qu'en hex. L'encodage ne correspond peut-être pas : un périphérique envoie du chinois en UTF-8 alors que le terminal série affiche du GBK, ou l'inverse, si bien que les octets UTF-8 E4 BD A0 E5 A5 BD de 你好 s'affichent 浣犲ソ. Ou bien le texte contient des octets de contrôle comme 00 ou 0D 0A, qui apparaissent sous forme de carrés ou de sauts de ligne. Collez l'hex ici : le tableau des encodages montre côte à côte les lectures UTF-8 et GBK, et les octets de contrôle sont affichés ␀ ␍ ␊.
    Quelle différence entre hex en ASCII et hex en UTF-8 ?
    L'ASCII ne définit que les octets 00 à 7F : lettres, chiffres, ponctuation et caractères de contrôle. L'UTF-8 est conçu pour que ces mêmes octets désignent exactement les mêmes caractères, et il utilise des séquences d'octets à partir de 80 pour tout le reste — 2 octets pour les lettres latines accentuées, 3 pour la plupart des caractères chinois, japonais et coréens, 4 pour les emoji. Pour un texte en anglais simple, hex en ASCII et hex en UTF-8 donnent donc des résultats identiques. Ils divergent dès qu'un octet vaut 80 ou plus : un convertisseur limité à l'ASCII ne peut pas afficher ces octets comme des caractères, alors que l'UTF-8 les décode dans toute l'étendue d'Unicode. Pour la signification de chaque octet de 00 à 7F, consultez la table ASCII.
    Combien d'octets fait un caractère chinois en hex ?
    Cela dépend de l'encodage. En UTF-8, la plupart des caractères chinois occupent 3 octets : 你 s'écrit E4 BD A0. En GBK et GB2312, ils en occupent 2 : 你 s'écrit C4 E3. En UTF-16, les caractères du plan multilingue de base occupent 2 octets, et l'ordre des octets compte : 你 s'écrit 60 4F en UTF-16LE et 4F 60 en UTF-16BE. Les caractères rares situés hors de ce plan occupent 4 octets en UTF-8, 4 en UTF-16 (une paire de substitution) et 4 en GB18030. Changez l'encodage dans l'onglet Texte → Hex pour voir le nombre d'octets de votre propre texte.
    Comment convertir de l'hex en texte en Python ?
    Utilisez bytes.fromhex() puis décodez : bytes.fromhex('48656c6c6f').decode('utf-8') renvoie 'Hello'. fromhex accepte les espaces entre les octets, donc bytes.fromhex('48 65 6c 6c 6f') fonctionne aussi, mais il rejette un préfixe 0x avec une ValueError. Pour des données GBK, décodez avec 'gbk' : bytes.fromhex('c4e3bac3').decode('gbk') renvoie '你好', alors que décoder les mêmes octets en UTF-8 lève UnicodeDecodeError. L'inverse est '你好'.encode('utf-8').hex(), qui renvoie 'e4bda0e5a5bd' ; passez un séparateur, par exemple .hex(' '), pour obtenir une sortie séparée par des espaces.
    Comment convertir de l'hex en texte en JavaScript ?
    Dans Node.js, Buffer.from('48656c6c6f', 'hex').toString('utf8') renvoie 'Hello'. Attention aux entrées invalides : Node ne lève pas d'erreur — il s'arrête à la première paire invalide et ignore sans prévenir un dernier chiffre isolé, si bien que Buffer.from('486', 'hex') est un buffer d'un seul octet. Dans le navigateur, construisez les octets vous-même et utilisez TextDecoder, qui lit aussi le GBK : new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16))) renvoie '你好'. N'utilisez pas charCodeAt() pour obtenir des octets : '你'.charCodeAt(0).toString(16) vaut '4f60', une unité de code UTF-16, et non les octets UTF-8 e4bda0.
    Comment convertir une chaîne hex en texte en C ou C++ ?
    Lisez deux chiffres hex à la fois dans un tampon unsigned char, puis terminez-le : for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0';n vaut strlen(hex) / 2. Avec hex égal à 48656c6c6f2c20e4b896e7958c, afficher buf donne Hello, 世界 sur un terminal UTF-8. Dans l'autre sens, affichez chaque octet avec printf("%02X ", (unsigned char)s[i]). Le cast est important : sur les plateformes où char est signé, un octet comme 0xE4 serait sinon étendu avec son signe et affiché FFFFFFE4. En C++, ajoutez chaque paire à la chaîne avec s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16))) ; le même hex donne Hello, 世界.
    Comment convertir de l'hex en texte en Java, et pourquoi Java affiche-t-il ffffffe4 ?
    Depuis Java 17, une seule ligne suffit : new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8) ; pour des données GBK, utilisez plutôt Charset.forName("GBK"). Dans l'autre sens, la surprise classique est ffffffe4, parce que le byte de Java est signé et que Integer.toHexString() prend un int. L'octet 0xE4 est stocké sous la forme -28 ; l'élargir en int conserve la valeur -28, et toHexString affiche les nombres négatifs sous leur valeur non signée sur 32 bits, ffffffe4. La même méthode supprime aussi les zéros de tête : 0x0A devient a. Utilisez String.format("%02x", b), qui formate un octet négatif sous sa valeur non signée sur 8 bits, ou Integer.toHexString(b & 0xff) avec un remplissage à deux chiffres. Depuis Java 17, HexFormat.of().formatHex(bytes) convertit un tableau entier, et HexFormat.of().parseHex(hex) fait l'inverse.
    Quelle fonction PHP convertit de l'hex en texte ?
    hex2bin() décode une chaîne hex en chaîne binaire, et bin2hex() fait l'inverse : bin2hex('Hello') renvoie 48656c6c6f. D'après le manuel PHP, hex2bin() renvoie false et émet un E_WARNING quand l'entrée a une longueur impaire ou n'est pas de l'hexadécimal valide : retirez donc les espaces et les préfixes 0x avant de l'appeler. Les chaînes PHP sont des octets, le résultat a donc l'encodage du texte d'origine — convertissez une sortie GBK avec mb_convert_encoding() si votre page est en UTF-8.
    Puis-je coller directement la sortie de xxd ou hexdump ?
    Oui. La colonne d'offsets et la colonne de caractères sont reconnues et retirées, et la ligne sous le champ de saisie vous le signale. C'est important, car un convertisseur qui se contente de retirer les espaces lit les offsets comme des données. La page gère xxd (y compris -u, -c et -g), hexdump -C, hex.Dump de Go, od -A x -t x1 et od -t x1z de GNU, et elle développe la ligne * que hexdump et od affichent à la place des lignes répétées. Elle gère aussi hexdump sans option et od -x, qui affichent des mots de 16 bits plutôt que des octets : sur une machine little-endian, les octets 48 69 sont affichés 6948, donc la page réinverse chaque paire et utilise le dernier offset pour retirer l'octet de remplissage ajouté aux données de longueur impaire. Chaque variante de xxd, hexdump et od a été testée sur 600 dumps réels de données aléatoires.
    Que signifie un nombre impair de chiffres hex ?
    Que quelque chose a été perdu ou ajouté, car chaque octet fait exactement deux chiffres hex. Causes fréquentes : un zéro de tête supprimé par une fonction qui convertit un nombre en hex (a au lieu de 0a), un caractère coupé lors du copier-coller, ou une lettre parasite comme O à la place de 0. Une chaîne hex obtenue en convertissant tous les octets comme un seul grand nombre, par exemple avec hex(int.from_bytes(data, 'big')) en Python, perd le zéro initial : \r\n devient 0xd0a. La page ne devine pas quel chiffre manque, car une mauvaise supposition décale tous les octets suivants d'un demi-octet et produit un charabia convaincant. Elle propose plutôt deux corrections en un clic — ajouter un 0 au début ou retirer le dernier chiffre — pour que vous compariez les résultats. Les valeurs écrites une par une avec un préfixe, comme 0x0 0xa, ne posent aucun problème : chacune est lue comme un octet entier.
    Les données que je colle sont-elles envoyées quelque part ?
    Non. La conversion s'exécute en JavaScript dans votre navigateur : rien n'est envoyé à un serveur, stocké ni ajouté à l'URL de la page. Vous pouvez le vérifier dans l'onglet Réseau des outils de développement de votre navigateur. C'est important ici, car l'hex collé dans un convertisseur est souvent une capture réseau, un dump de firmware ou une ligne d'un log de production.