Hex to Text Converter
Convert hex to text and text to hex, with UTF-8 support, live in your browser.
- Free, no account
- No watermark
- No usage limit
About the Hex to Text
Paste a string of hex, get the text it spells out, and it runs both directions, live as you type. Everything stays on your own machine, nothing you paste is uploaded or logged, so you can decode a hex string you'd rather not hand to some random website. The real reason to reach for this one over the dozen other "hex to text" boxes online is a trap most of them quietly fall into.
A lot of those tools are hex to ASCII converters with a nicer name. They read each byte as one character and stop there. Fine for plain English, where one letter is one byte, and it falls apart the second your text has an accent, a non-Latin script, or an emoji. Paste the two bytes c3 a9 into one of those and you get é, two garbage characters, instead of the single é they actually stand for. This one decodes real UTF-8, so c3 a9 comes back as é, a four-byte emoji comes back as that emoji, and Greek, Cyrillic, or Japanese all land correctly.
And when your hex genuinely isn't valid text, it says so instead of guessing. Give it a stray g or an odd digit count and it points right at the problem, rather than printing a row of replacement boxes and leaving you to wonder whether the hex was wrong or the tool choked on it.
How to use
- Pick a direction. Hex → Text turns hex into readable characters. Text → Hex goes the other way.
- Paste or type into the top box. Decoding, your hex can be spaced, run together, comma or colon separated, or carry
0x/\xprefixes. Encoding, type any text, accents and emoji included. - Read the result underneath. It updates on every keystroke, there's no convert button to press.
- For encoding, the three toggles shape the output: Space between bytes, a 0x prefix, or Uppercase letters.
- Copy result grabs the output, Swap flips the direction and feeds the result back through, and Clear starts you over.
Why other converters botch accents and this one doesn't
Every hex-to-text conversion is two hops. First the hex gets read two digits at a time into bytes, so 48 is 72, 65 is 101, 6c is 108. Those are just numbers, 0 to 255, no meaning yet. Then those numbers get looked up in a character table, and which table you use decides everything. 72 is H, 101 is e, 108 is l, and 48 65 6c 6c 6f reads out as Hello.
For plain English it barely matters which table, since ASCII and UTF-8 agree on every character below 128, A is 41 in both. The difference shows up once you go past the English keyboard. ASCII has no number for é, a Cyrillic letter, a euro sign, or an emoji, it ran out of room back in the 1960s at 128 characters. UTF-8 covers all of it by spending more than one byte on the bigger characters.
That's why é is two bytes, not one. Its Unicode code point is 233, too big for a single byte, so UTF-8 stores it as c3 a9. Encode é here and you get c3a9 back, four hex digits for one character, and most emoji cost four bytes, eight hex digits for a single glyph. That's the honest byte count, not a quirk to route around, and a converter that only understands one byte per character has no way to give it to you.
Knowing this pays off when you're debugging. If you've ever seen café turn into café on a web page, that's this exact mismatch caught in the act, the UTF-8 bytes got read as if each were its own Latin-1 character. The garbled é is just the c3 a9 bytes shown through the wrong table, and recognizing them as one character rather than two is often what untangles the bug.
What it strips, and what it refuses to guess
Hex shows up in a few spacings that all mean the same bytes. Spaced (48 65 6c 6c 6f) is the readable hex-dump form. Run together (48656c6c6f) is what you find in a config value or a hash. Prefixed (0x48 0x65) is how source code and debuggers write it, with \x48 as a common variant. When you paste hex to decode, this tool strips all of that first, the spaces, newlines, tabs, commas, colons, and any 0x or \x on each byte, then decodes whatever hex is left. Paste straight from a debugger, a config file, or a solid run of digits and you get the same answer.
Where it won't bend is on correctness. If there's a character in your hex that isn't a hex digit, it stops and names it, "found g", instead of dropping it silently. An odd number of digits gets flagged too, since each byte is two digits and an odd total means one went missing. And bytes that decode to something that isn't valid text get caught, rather than filling the box with replacement characters. When you're debugging, a plausible-looking wrong answer is the worst thing a tool can hand you, so a clear error you can act on beats a silent guess.
Reading a hex dump
The place this comes up most is a hex dump, the side-by-side view a hex editor or packet analyzer shows: an address on the left, the bytes as hex pairs in the middle, and an ASCII rendering on the right where printable characters show as themselves and everything else shows as a dot. You spot an interesting run of bytes, want to know what it says, so you copy it in here and decode.
File formats announce themselves in those first few bytes. A PNG image opens with 89 50 4e 47, and 50 4e 47 spells PNG. A PDF starts with 25 50 44 46, which is %PDF. A ZIP archive begins with 50 4b, which decodes to PK, the initials of Phil Katz, who wrote the format. Half-reading a dump gets easier once a handful of byte values stick, 20 is a space, 0a a newline, 41 capital A.
Frequently asked questions
Is "hex to text" the same as "hex to ASCII"?
For plain English you'll get the same answer either way, because ASCII characters are identical in UTF-8. The two only split once a byte value climbs above 127. A pure ASCII tool reads every byte as one character and can't represent anything past the basic English set, so accented letters come out wrong. This converter uses UTF-8, a superset of ASCII, so it matches ASCII on the simple stuff and keeps working on everything else.
Can I paste a whole hex dump straight in?
Only the hex column. A dump usually has an address on the left and a readable rendering on the right, and those are text, not hex, so pasting the whole three-column block trips the invalid-character error. Copy just the middle column of hex pairs and it decodes cleanly, since the spacing inside it gets stripped anyway.
Why does a single emoji turn into eight hex digits?
Because it's four bytes, and each byte is two hex digits. UTF-8 uses one byte for the old ASCII range, two for most accented and European characters, three for the bulk of the world's other scripts, and four for emoji plus the more obscure symbols. Most emoji sit high enough in Unicode to need the full four, so one glyph works out to eight hex digits. Decode those eight and the emoji comes back whole.
Does uppercase or lowercase hex change anything?
Not the value. FF and ff are the same byte, 255, and decoding accepts either. Case is only a display habit, lowercase is standard in web development, Unix tools, and hashes like Git commit IDs, while uppercase turns up more in older systems and some specs. When you encode, the Uppercase toggle matches whatever the target expects. The bytes stay identical regardless.
Is anything I paste sent to a server?
No. The conversion happens in your browser, on your device, with no upload and nothing stored or logged. You can watch the network tab stay quiet, and once the page has loaded it keeps working with the connection off. That's the whole point of doing it locally, you can decode something sensitive without trusting a stranger's server with it.
How do I turn a number like 255 into hex instead of a character?
Use a base converter for that, not this. This tool works on characters: type 5 in encode mode and you get 35, the byte for the character five, not 05, which is the number five in hex. A base converter does place-value math on the number itself and never touches a character table. If you mean the raw number, that's the base tool, if you mean text, you're in the right spot.