Skip to content

Hex naar tekst omzetten (en tekst naar hex)

Zet hex om naar tekst en terug. Plak hex in elke vorm — met spaties, 0x, \x, xxd- of hexdump-uitvoer, Java- of C-byte-arrays — en ASCII, UTF-8, GBK of UTF-16 wordt automatisch herkend. Draait in je browser.

Geen tracking Draait in je browser Gratis
Alles draait in je browser — niets wat je plakt verlaat dit apparaat.
Probeer een voorbeeld

Gelezen als kale hex · 13 bytes

    Tekst
    Hello, 世界

    Automatisch gedetecteerd: UTF-8 — elke multibyte-reeks is welgevormd.

    Dezelfde bytes in elke codering

    Codering Gelezen als
    UTF-8 Foutloos gedecodeerd Hello, 世界
    GBK / GB18030 Foutloos gedecodeerd Hello, 涓栫晫
    UTF-16LE Bevat niet-decodeerbare bytes 效汬Ɐ隸闧�
    UTF-16BE Bevat niet-decodeerbare bytes 䡥汬漬⃤뢖�
    ISO-8859-1 Foutloos gedecodeerd Hello, ä¸<96>ç<95><8C>
    De hexdumps, byte-arrays en foutmeldingen op deze pagina komen uit echte runs van xxd, Python 3.14, Node.js 26, Go 1.27 en clang, en tests controleren dat elk uitvoerformaat van de engine weer terug te lezen is naar de oorspronkelijke bytes. Het gedrag van Java en PHP is ontleend aan de officiële documentatie. — Go Tools Engineering · Sep 16, 2026

    Geschreven en gecontroleerd door de ontwikkelaars die de coderingstools van Go Tools bouwen. Elke hexwaarde en elke uitvoer op deze pagina komt uit de eigen engine van de pagina en wordt gecontroleerd met geautomatiseerde tests.

    Hex naar ASCII: snelle antwoorden

    Wat is 48 65 6C 6C 6F als tekst?

    Hello 48 is H, 65 is e, 6C is l en 6F is o in ASCII en UTF-8.

    Hoeveel bytes is één Chinees teken?

    Meestal 3 bytes in UTF-8, 2 in GBK 你 is E4 BD A0 in UTF-8 en C4 E3 in GBK.

    Wat is 0D 0A?

    CR LF (\r\n) Carriage return gevolgd door line feed — het regeleinde van Windows, HTTP en de meeste seriële commandosets.

    Wat is de letter A in hex?

    41 De kleine letter a is 61; hoofdletter en kleine letter verschillen altijd 20.

    Wat is hex naar tekst omzetten?

    Hexadecimaal is een manier om bytes te noteren: elke byte, van 0 tot 255, wordt geschreven als twee cijfers van 00 tot FF. Hex naar een string omzetten maakt van die bytes weer leesbare tekst, en daarbij hoort altijd de keuze voor een tekencodering — de tabel die bepaalt welke byte, of reeks bytes, voor welk teken staat.

    Bij Engelse tekst merk je die keuze zelden, omdat ASCII, UTF-8, GBK en de meeste andere coderingen het eens zijn over de bytes 00 tot 7F. Bij al het andere zie je het meteen. De bytes C4 E3 BA C3 zijn 你好 in GBK en ongeldig in UTF-8, terwijl 你好 in UTF-8 E4 BD A0 E5 A5 BD is. De hex is maar de helft van de informatie; de codering is de andere helft.

    String naar hex is het omgekeerde: encodeer de tekst naar bytes en schrijf dan elke byte als twee hexcijfers. Ontwikkelaars gebruiken dat om precies te zien wat er over een seriële lijn of in een databasekolom gaat, om binaire data in broncode op te nemen en om te vergelijken wat twee systemen werkelijk hebben verstuurd.

    $ 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

    Wat deze hexconverter doet

    Plak hex in elke vorm

    Met spaties, compact, gescheiden door dubbele punten of streepjes, 0x-waarden, \x-escapes, %-codering, C-, Go- en Java-arrays, de signed Arrays.toString-uitvoer van Java, Python-bytesliterals, Node.js-buffers en complete schermen van xxd, hexdump -C en od. De pagina vertelt wat ze heeft herkend en wat ze heeft verwijderd.

    Codering gedetecteerd, met de reden erbij

    Automatische detectie controleert op een byte-order mark, welgevormde UTF-8, UTF-16, pure ASCII en daarna GBK, en vertelt welke regel de doorslag gaf. GBK wordt alleen gekozen als de bytes als gangbare Chinese tekens te lezen zijn, dus korte binaire frames worden gemeld als waarschijnlijk geen tekst in plaats van als onzinnig Chinees.

    Alle coderingen naast elkaar

    Dezelfde bytes worden getoond als UTF-8, GBK, UTF-16LE, UTF-16BE en ISO-8859-1, elk gemarkeerd als foutloos te decoderen of niet. Komt er onleesbare tekst uit, dan staat de juiste lezing meestal een rij lager.

    Onzichtbare bytes zichtbaar gemaakt

    NUL, CR, LF, ESC en andere stuurbytes worden getoond als ␀ ␍ ␊ ␛, zodat een afsluitende 00 of een ontbrekende 0D in protocoldata opvalt. Kopiëren levert nog steeds de echte tekens op.

    Uitvoer klaar om in code te plakken

    Tekst → hex schrijft hex met spaties of compact, 0x-lijsten, \x-escapes, een C-array in de stijl van xxd -i, een Java-byte[] met signed waarden, een Python-bytesliteral die overeenkomt met repr(), een Go-[]byte of een xxd-dump — en de pagina kan elk van die formaten weer inlezen.

    Niets verlaat je browser

    Inlezen en decoderen gebeuren lokaal in JavaScript. Niets wordt geüpload, opgeslagen of in de URL gezet, dus pakketcaptures en productielogs kun je gerust plakken.

    Hex naar string omzetten in code

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8') geeft 'Hello'; spaties tussen bytes mogen, een 0x-prefix niet. De omgekeerde richting is s.encode('utf-8').hex(), of .hex(' ') voor uitvoer met spaties. Geef 'gbk' mee om Chinese tekst in GBK te decoderen of te encoderen.

    JavaScript (Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8') decodeert, Buffer.from(s, 'utf8').toString('hex') encodeert. Ongeldige invoer is geen fout: decoderen stopt bij het eerste foute paar en een overgebleven oneven cijfer valt weg, dus valideer eerst.

    JavaScript (browser)

    TextDecoder / TextEncoder

    Lees paren met parseInt(pair, 16) in een Uint8Array in en gebruik dan new TextDecoder('utf-8').decode(bytes). TextDecoder leest ook 'gbk', 'big5' en 'shift_jis', maar TextEncoder produceert alleen UTF-8.

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) decodeert en HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) encodeert. Op oudere versies formatteer je elke byte met String.format("%02x", b); vermijd Integer.toHexString(b), dat ffffffe4 afdrukt voor negatieve bytes.

    Go

    encoding/hex

    hex.DecodeString(h) geeft de bytes terug en string(b) maakt er een string van; hex.EncodeToString([]byte(s)) doet het omgekeerde. Het pakket is streng: spaties geven invalid byte: U+0020 ' ' en een oneven lengte geeft odd length hex string.

    C

    sscanf with %2hhx

    Loop in stappen van twee cijfers door de string, lees ze in een unsigned char-buffer en voeg een afsluitende '\0' toe. Om hex af te drukken cast je naar unsigned char en gebruik je %02X; anders kunnen bytes boven 0x7F als FFFFFFE4 worden afgedrukt waar char signed is.

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f') geeft Hello en bin2hex('Hello') geeft 48656c6c6f. Volgens de handleiding geeft hex2bin() bij een oneven lengte of ongeldige invoer false terug, met een E_WARNING.

    Shell (xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p drukt Hello af, en printf 'Hello' | xxd -p drukt 48656c6c6f af. Gebruik bij het encoderen printf in plaats van echo, want echo voegt een afsluitende newline toe, 0a.

    C# (.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h)) decodeert en Convert.ToHexString(Encoding.UTF8.GetBytes(s)) encodeert (hoofdletters, zonder scheidingstekens). FromHexString weigert spaties en een 0x-prefix. .NET Core en .NET 5+ bevatten geen GBK: roep eerst Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) aan en daarna Encoding.GetEncoding(936).

    Voorbeelden van hex naar tekst

    UTF-8-hex met Chinese tekens

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

    De eerste zeven bytes zijn gewone ASCII: 48 65 6C 6C 6F is Hello, 2C is een komma en 20 een spatie. E4 B8 96 en E7 95 8C zijn UTF-8-reeksen van drie bytes voor 世 en 界 — de meeste Chinese tekens nemen in UTF-8 drie bytes in beslag. Omdat elke reeks welgevormd is, leest automatische detectie het als UTF-8.

    Een GBK-sensorwaarde die geen geldige UTF-8 is

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

    Veel seriële apparaten sturen Chinese tekst in GBK. Hier is CE C2 温 en B6 C8 度, 3A 32 35 2E 33 is de ASCII-tekst :25.3, en A1 E6 is het ℃-teken in volle breedte — twee bytes per Chinees teken of symbool. Als UTF-8 gelezen zijn de bytes ongeldig (CE begint een reeks van twee bytes, maar C2 is geen vervolgbyte); als GBK gelezen zijn het gangbare tekens, dus kiest automatische detectie GBK. Een converter die alleen UTF-8 kent, toont hier vervangingstekens.

    xxd-uitvoer zoals die is geplakt

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

    Dit is precies wat printf 'Hi 你好\r\n' | xxd afdrukt. De offset 00000000: en de tekenkolom rechts worden vóór het decoderen verwijderd; zouden ze als data worden gelezen, dan leverden alleen de acht nullen al vier NUL-bytes aan het begin op. De laatste twee bytes, 0d 0a, zijn een Windows-regeleinde, getoond als ␍␊.

    Een Java-byte-array uit een log

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

    Arrays.toString(bytes) drukt de signed bytes van Java decimaal af. Negatieve waarden zijn bytes van 0x80 en hoger: -28 is 256 − 28 = 228 = 0xE4. De zes bytes E4 B8 AD E6 96 87 zijn de UTF-8-codering van 中文.

    Tekst naar hex voor een serieel AT-commando

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

    Modems en de meeste UART-commandosets verwachten dat elk commando eindigt op carriage return plus line feed. Een tekstvak geeft bij Enter alleen 0A, dus vink Regeleinden als CR LF aan en het regeleinde wordt 0D 0A.

    Hex die twee keer als hex is geëncodeerd

    653462646130653561356264
    e4bda0e5a5bd → 你好

    Elke byte hier is een ASCII-hexcijfer (65 is e, 34 is 4, 62 is b), dus de eerste decodering levert weer een hexstring op. Dat gebeurt als een hexstring als tekst wordt behandeld en nog een keer wordt omgezet. De pagina biedt een tweede ronde aan, die 你好 oplevert. Om loos alarm te voorkomen doet ze dat alleen als het eerste resultaat minstens 12 hexcijfers lang is en de tweede ronde echte tekst oplevert — datums, timestamps, CRC32-waarden en MD5-hashes activeren dit niet.

    Zo zet je hex om naar tekst

    1. 1

      Plak de hex

      Plak hem in het vak op het tabblad Hex → tekst, in welke vorm je hem ook hebt: met spaties, compact, 0x-waarden, \x-escapes, een byte-array of een compleet xxd-scherm. De regel onder het vak vertelt hoe hij is gelezen.

    2. 2

      Controleer de tekst en de codering

      De tekst verschijnt rechts, met de automatisch gedetecteerde codering en de reden daarvoor. Zit de gok ernaast, dan toont de tabel eronder elke lezing; kies de juiste in het menu Codering.

    3. 3

      Let op onzichtbare tekens

      Stuurbytes zoals NUL, CR en LF worden getoond als ␀ ␍ ␊. Vink Onzichtbare tekens tonen uit voor de platte tekst en kopieer daarna het resultaat.

    4. 4

      Of zet tekst om naar hex

      Kies op het tabblad Tekst → hex de codering en een uitvoerformaat — hex met spaties, 0x-waarden, een C-, Java-, Python- of Go-array, of een xxd-dump. Vink CR LF aan voor seriële protocollen en netwerkprotocollen.

    Waarom hex naar tekst omzetten misgaat

    GBK-bytes als UTF-8 decoderen

    Chinese tekst uit oudere Windows-software, veel seriële apparaten en legacy databases is GBK. Als je die als UTF-8 decodeert, mislukt dat of raakt de uitvoer vol vervangingstekens. Kijk in de coderingstabel en gebruik de lezing die klopt.

    ✗ Fout
    >>> 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')
    '你好'

    charCodeAt() gebruiken om bytes te krijgen in JavaScript

    charCodeAt() geeft een UTF-16-code-unit terug. Voor ASCII komt die toevallig overeen met de byte, dus de bug duikt pas op bij andere tekens, en dan is het resultaat niet wat een UTF-8-systeem verstuurt.

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

    Signed bytes formatteren met Integer.toHexString in Java

    byte is in Java signed, dus bytes vanaf 0x80 zijn negatief. Integer.toHexString() werkt op een int, drukt negatieve waarden af als unsigned 32-bit-hex en laat voorloopnullen weg.

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

    Ongecontroleerde hex blind aan Node.js Buffer.from() geven

    Buffer.from(hex, 'hex') gooit nooit een fout. Het stopt bij het eerste paar dat geen geldige hex is en negeert een overgebleven oneven cijfer, dus een typefout levert een kortere buffer op in plaats van een foutmelding.

    ✗ Fout
    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');

    Een hexdump plakken met de offsetkolom erbij

    Een converter die alleen spaties verwijdert, leest de offset 00000000: als data en de tekenkolom waar mogelijk als extra hex. Het resultaat begint met NUL-bytes en raakt vanaf daar steeds verder uit de pas. Gebruik xxd -p voor kale hex, of plak de dump hier, waar de kolommen worden herkend.

    ✗ Fout
    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

    LF sturen waar het apparaat CR LF verwacht

    AT-modems en veel regelgebaseerde protocollen sluiten elk commando af met carriage return plus line feed. Een commando dat alleen op 0A eindigt, wordt vaak genegeerd, zonder enige foutmelding.

    ✗ Fout
    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

    Wanneer je hex naar tekst moet omzetten

    Seriële verbindingen en UART debuggen
    Seriële terminals tonen ontvangen data als hex. Plak een frame om de tekst erin te lezen en de 0D 0A of 00 aan het eind te zien — of werk andersom en bouw een commando met CR LF-regeleinden dat een apparaat accepteert.
    Pakketcaptures lezen
    Protocolpayloads die je uit Wireshark of tcpdump kopieert, zijn hex. Een requestregel, een JSON-body of een apparaatnaam in een frame decoderen gaat hier sneller dan een script schrijven, en niets verlaat je computer.
    Byte-arrays in applicatielogs
    Java logt byte-arrays als signed decimale getallen, Python als b'...'-literals en Node.js als <Buffer ...>. Plak het logfragment zoals het is om de tekst te zien, inclusief of het UTF-8 of GBK was.
    Hexkolommen en BLOB's in databases
    Databasetools tonen binaire kolommen als hex. Decodeer een waarde om te controleren wat er werkelijk is opgeslagen, of zet tekst om naar hex om byte voor byte te vergelijken met wat de database bevat.
    Strings in firmware en C-broncode
    Embedded code bewaart tekst in byte-arrays. Maak van een string een C-array die je direct kunt plakken, of lees een array uit een headerbestand terug als tekst om te bevestigen wat het apparaat zal afdrukken.

    Van hex naar tekst: ASCII, UTF-8, GBK en UTF-16

    Twee hexcijfers per byte
    Een byte bevat 8 bits en een hexcijfer 4, dus elke byte is precies twee hexcijfers, 00 tot FF, en het aantal bytes is altijd de helft van het aantal cijfers. Hoofdletters en kleine letters betekenen hetzelfde. Scheidingstekens, prefixen en array-syntaxis zijn alleen notatie: 4865, 48 65, 0x48, 0x65 en \x48\x65 zijn dezelfde twee bytes.
    ASCII: de bytes waarover elke codering het eens is
    ASCII wijst 00 tot 7F toe. Afdrukbare tekens lopen van 20 (spatie) tot 7E (~); de rest zijn stuurtekens, waarvan 00 (NUL), 09 (tab), 0A (line feed), 0D (carriage return) en 1B (escape) het vaakst in echte data voorkomen. UTF-8, GBK en ISO-8859-1 behouden deze waarden allemaal, en daarom overleeft gewoon Engels bijna elke verkeerde codering.
    UTF-8: één tot vier bytes per teken
    UTF-8 schrijft ASCII als losse bytes en elk ander teken als een reeks. De eerste byte geeft de lengte aan — C2DF voor twee bytes, E0EF voor drie, F0F4 voor vier — en elke volgende byte moet in 80BF liggen. Door die strikte structuur is een GBK-zin bijna nooit geldige UTF-8 — in onze test met 33.910 Chinese zinnen gold dat voor 55 — en daarom vertrouwt automatische detectie op een foutloze UTF-8-decodering. Een los Chinees teken is een ander verhaal: ongeveer 18% van de GBK-tekens vormt toevallig een geldige UTF-8-reeks van twee bytes.
    GBK: twee bytes per Chinees teken
    GBK houdt ASCII als losse bytes en encodeert Chinese tekens en leestekens in volle breedte als twee bytes: een eerste byte van 81 tot FE, gevolgd door een tweede byte van 40 tot FE, met uitzondering van 7F. Omdat het bereik van die tweede byte zo breed is, laat korte UTF-8-tekst zich als GBK vaak zonder enige fout decoderen tot tekens die er niets mee te maken hebben — E4 BD A0 E5 A5 BD (你好) wordt 浣犲ソ — en daarom probeert deze pagina eerst UTF-8. GB18030 breidt GBK uit met reeksen van vier bytes voor zeldzamere tekens; de decodering hier accepteert die.
    UTF-16 en bytevolgorde
    UTF-16 gebruikt twee bytes per teken (vier voor tekens buiten het Basic Multilingual Plane), en die twee bytes kunnen in beide volgordes staan. UTF-16LE zet de lage byte eerst — A is 41 00 — en UTF-16BE de hoge byte — 00 41. Windows-API's en veel bestanden gebruiken little-endian en kunnen beginnen met een byte-order mark, FF FE; UTF-8-bestanden beginnen soms met EF BB BF. Automatische detectie verwijdert een byte-order mark en meldt dat.

    Hex en strings betrouwbaar omzetten

    Benoem de codering aan beide kanten
    Hex alleen zegt niet met welke codering het is gemaakt. Overal waar tekst in bytes verandert — getBytes(), encode(), een instelling van een seriële terminal, de charset van een databaseverbinding — stel je de codering expliciet in en noteer je die naast de hex, zodat de andere kant niet hoeft te raden.
    Werk met bytes, niet met tekencodes
    Functies die tekencodes teruggeven, zoals charCodeAt() in JavaScript of char-waarden in Java, leveren UTF-16-code-units op in plaats van geëncodeerde bytes. Encodeer de string eerst met TextEncoder, Buffer.from() of getBytes(StandardCharsets.UTF_8) en formatteer daarna de bytes.
    Vul elke byte altijd aan tot twee cijfers
    Gebruik %02x of iets gelijkwaardigs, nooit een kale getal-naar-hexaanroep. a en 0a lijken in een log op elkaar, maar waarden zonder opvulling aan elkaar plakken levert een string met een oneven lengte op, of erger, een die naar andere bytes decodeert.
    Houd scheidingstekens consistent binnen één log
    Kies één formaat voor logs en traces, zoals paren gescheiden door spaties, en houd je daaraan. Gemengde formaten zijn voor mensen makkelijk te lezen en voor scripts makkelijk verkeerd te lezen, vooral als sommige waarden zijn opgevuld en andere niet.
    Controleer het aantal bytes
    Voordat je een omzetting vertrouwt, vergelijk je het aantal bytes met wat je verwacht: het lengteveld in een protocolheader, de kolomgrootte of de bestandsgrootte. De pagina toont het aantal voor beide richtingen.

    Veelgestelde vragen over hex naar tekst

    Hoe zet je hex om naar tekst of een string?
    Plak de hex in het vak op het tabblad Hex → tekst; de tekst verschijnt meteen. Met de hand zijn het twee stappen. Eerst splits je de hex in paren: elk paar hexcijfers is één byte, van 00 tot FF, dus 48656c6c6f bestaat uit de vijf bytes 48, 65, 6C, 6C, 6F. Daarna decodeer je die bytes met een tekencodering. In ASCII en UTF-8 is 48 H, 65 e, 6C l en 6F o, samen Hello. Bij die tweede stap lopen de resultaten uiteen: bytes boven 7F staan in UTF-8, GBK en andere coderingen voor verschillende tekens. Daarom detecteert deze pagina de codering en toont ze alle lezingen naast elkaar.
    Waarom verandert mijn hex in onleesbare tekens?
    Bijna altijd omdat de bytes met de verkeerde codering worden gedecodeerd. Chinese tekst is het klassieke geval: C4 E3 BA C3 is 你好 in GBK maar ongeldige UTF-8, en E4 BD A0 E5 A5 BD is 你好 in UTF-8 maar wordt als GBK gelezen 浣犲ソ. Kijk naar de coderingstabel onder het resultaat — de rij met zinnige tekst is de codering waarin de data is geschreven. Met maar één of twee tekens kan automatische detectie het niet altijd zeggen: D2 BB is geldige UTF-8 (һ) en ook GBK (一), dus controleer de GBK-regel die de pagina onder het resultaat toont. Twee andere oorzaken zijn het uitsluiten waard: een hexcijfer te veel of te weinig, waardoor elke volgende byte een halve byte verschuift, en een geplakte hexdump waar de offsetkolom nog aan vastzit. Heb je geen hex maar al onleesbare tekst (zoals 浣犲ソ), plak die tekst dan in de encoding converter.
    Seriële data is als tekst onleesbaar maar in hex correct — waarom?
    Als de hex klopt, zijn de baudrate, databits en pariteit in orde — staan die verkeerd, dan veranderen de bytes zelf. Het probleem zit in de stap die bytes omzet naar tekens, en meestal is het een van drie dingen. De data is misschien helemaal geen tekst: een binair protocol zoals Modbus RTU is alleen als hex te begrijpen. De codering komt misschien niet overeen: een apparaat stuurt Chinees als UTF-8 terwijl de seriële terminal GBK weergeeft, of andersom, zodat de UTF-8-bytes E4 BD A0 E5 A5 BD voor 你好 verschijnen als 浣犲ソ. Of de tekst bevat stuurbytes zoals 00 of 0D 0A, die verschijnen als vakjes of regeleinden. Plak de hex hier: de coderingstabel toont de UTF-8- en GBK-lezing naast elkaar, en stuurbytes verschijnen als ␀ ␍ ␊.
    Wat is het verschil tussen hex naar ASCII en hex naar UTF-8?
    ASCII definieert alleen de bytes 00 tot 7F: letters, cijfers, leestekens en stuurtekens. UTF-8 is zo opgebouwd dat precies die bytes dezelfde tekens betekenen, en gebruikt voor al het andere reeksen bytes vanaf 80 — 2 bytes voor Latijnse letters met accenten, 3 voor de meeste Chinese, Japanse en Koreaanse tekens, 4 voor emoji. Voor gewone Engelse tekst geven hex naar ASCII en hex naar UTF-8 dus identieke resultaten. Ze verschillen zodra een byte 80 of hoger is: een converter die alleen ASCII kent, kan die bytes niet als tekens tonen, terwijl UTF-8 ze decodeert naar het volledige bereik van Unicode. Wat elke byte van 00 tot 7F betekent, zie je in de ASCII-tabel.
    Hoeveel bytes is een Chinees teken in hex?
    Dat hangt af van de codering. In UTF-8 nemen de meeste Chinese tekens 3 bytes in: 你 is E4 BD A0. In GBK en GB2312 zijn het 2 bytes: 你 is C4 E3. In UTF-16 nemen tekens in het Basic Multilingual Plane 2 bytes in, en de bytevolgorde doet ertoe: 你 is 60 4F in UTF-16LE en 4F 60 in UTF-16BE. Zeldzame tekens buiten dat vlak nemen 4 bytes in UTF-8 in, 4 in UTF-16 (een surrogaatpaar) en 4 in GB18030. Wissel de codering op het tabblad Tekst → hex om het aantal bytes voor je eigen tekst te zien.
    Hoe zet je in Python hex om naar een string?
    Gebruik bytes.fromhex() en decodeer daarna: bytes.fromhex('48656c6c6f').decode('utf-8') geeft 'Hello'. fromhex accepteert spaties tussen bytes, dus bytes.fromhex('48 65 6c 6c 6f') werkt ook, maar een 0x-prefix wijst het af met een ValueError. Decodeer GBK-data met 'gbk': bytes.fromhex('c4e3bac3').decode('gbk') geeft '你好', terwijl dezelfde bytes als UTF-8 decoderen een UnicodeDecodeError oplevert. De omgekeerde richting is '你好'.encode('utf-8').hex(), dat 'e4bda0e5a5bd' teruggeeft; geef een scheidingsteken mee, zoals .hex(' '), voor uitvoer met spaties.
    Hoe zet je in JavaScript hex om naar een string?
    In Node.js geeft Buffer.from('48656c6c6f', 'hex').toString('utf8') de waarde 'Hello' terug. Let op bij foute invoer: Node gooit geen fout — het stopt bij het eerste ongeldige paar en laat een overgebleven oneven cijfer stilletjes vallen, dus Buffer.from('486', 'hex') is een buffer van één byte. In de browser bouw je de bytes zelf op en gebruik je TextDecoder, dat ook GBK leest: new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16))) geeft '你好'. Gebruik geen charCodeAt() om bytes te krijgen: '你'.charCodeAt(0).toString(16) is '4f60', een UTF-16-code-unit, niet de UTF-8-bytes e4bda0.
    Hoe zet je in C of C++ een hexstring om naar een string?
    Lees telkens twee hexcijfers in een unsigned char-buffer en sluit die daarna af: for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0';, waarbij n gelijk is aan strlen(hex) / 2. Met hex ingesteld op 48656c6c6f2c20e4b896e7958c geeft het afdrukken van buf Hello, 世界 op een UTF-8-terminal. Voor de andere richting druk je elke byte af met printf("%02X ", (unsigned char)s[i]). De cast is belangrijk: op platforms waar char signed is, zou een byte als 0xE4 anders met tekenuitbreiding als FFFFFFE4 worden afgedrukt. In C++ voeg je elk paar toe met s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16))); dezelfde hex geeft Hello, 世界.
    Hoe zet je in Java hex om naar een string, en waarom drukt Java ffffffe4 af?
    Vanaf Java 17 is het één regel: new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8); gebruik voor GBK-data in plaats daarvan Charset.forName("GBK"). In de andere richting is ffffffe4 de klassieke verrassing. Die ontstaat omdat byte in Java signed is en Integer.toHexString() een int verwacht. De byte 0xE4 wordt opgeslagen als -28; bij de verbreding naar int blijft de waarde -28, en toHexString drukt negatieve getallen af als de unsigned 32-bitwaarde, ffffffe4. Dezelfde methode laat ook voorloopnullen weg, dus 0x0A wordt a. Gebruik String.format("%02x", b), dat een negatieve byte als unsigned 8-bitwaarde formatteert, of Integer.toHexString(b & 0xff) met opvulling. Vanaf Java 17 zet HexFormat.of().formatHex(bytes) een hele array om, en HexFormat.of().parseHex(hex) doet het omgekeerde.
    Welke PHP-functie zet hex om naar een string?
    hex2bin() decodeert een hexstring naar een binaire string, en bin2hex() doet het omgekeerde: bin2hex('Hello') geeft 48656c6c6f. Volgens de PHP-handleiding geeft hex2bin() false terug en een E_WARNING als de invoer een oneven lengte heeft of geen geldige hexadecimale waarde is, dus haal spaties en 0x-prefixen weg voordat je de functie aanroept. PHP-strings zijn bytes, dus het resultaat heeft de codering die de oorspronkelijke tekst had — zet GBK-uitvoer om met mb_convert_encoding() als je pagina UTF-8 gebruikt.
    Kan ik uitvoer van xxd of hexdump direct plakken?
    Ja. De offsetkolom en de tekenkolom worden herkend en verwijderd, en de regel onder het invoervak meldt dat. Dat is belangrijk, want een converter die alleen spaties weghaalt, leest de offsets als data. De pagina kan overweg met xxd (ook met -u, -c en -g), hexdump -C, hex.Dump van Go, od -A x -t x1 en GNU od -t x1z, en vouwt de *-regel uit die hexdump en od afdrukken in plaats van herhaalde rijen. Ook gewone hexdump en od -x worden ondersteund; die drukken 16-bitwoorden af in plaats van bytes: op een little-endian machine worden de bytes 48 69 afgedrukt als 6948, dus draait de pagina elk paar weer om en gebruikt ze de laatste offset om de opvulbyte te laten vallen die bij data van oneven lengte wordt toegevoegd. Elke variant van xxd, hexdump en od is getest met 600 echte dumps van willekeurige data.
    Wat betekent een oneven aantal hexcijfers?
    Er is iets verloren gegaan of bijgekomen, want elke byte is precies twee hexcijfers. Veelvoorkomende oorzaken zijn een voorloopnul die een getal-naar-hexfunctie heeft weggelaten (a in plaats van 0a), een teken dat bij het kopiëren is weggevallen, of een verdwaalde letter zoals O in plaats van 0. Een hexstring die ontstaat door alle bytes als één groot getal om te zetten, zoals met hex(int.from_bytes(data, 'big')) in Python, verliest de nul aan het begin: \r\n wordt 0xd0a. De pagina raadt niet welk cijfer ontbreekt, want verkeerd raden verschuift elke volgende byte een halve byte en levert overtuigende onzin op. In plaats daarvan biedt ze twee oplossingen die je met één klik toepast — een 0 vooraan toevoegen of het laatste cijfer verwijderen — zodat je de resultaten kunt vergelijken. Waarden die afzonderlijk met een prefix zijn geschreven, zoals 0x0 0xa, zijn geen probleem: elke waarde wordt als hele byte gelezen.
    Wordt de data die ik plak ergens naartoe geüpload?
    Nee. De omzetting gebeurt in JavaScript in je browser: er gaat niets naar een server, er wordt niets opgeslagen en er komt niets in de URL van de pagina. Je kunt dat controleren in het tabblad Netwerk van de ontwikkelaarstools van je browser. Dat is hier belangrijk, want hex die in een converter wordt geplakt, is vaak een pakketcapture, een firmwaredump of een regel uit een productielog.

    Gerelateerde tools

    Alle tools bekijken →