Convert hex to ASCII
Decode hex byte values into ASCII characters, one byte per character, with clear errors for values outside the printable range.
- Runs in your browser
- Nothing you enter is sent
- Free, no account
The converted value appears here.
One byte per character, 0-255. Anything above U+00FF is rejected rather than mangled.
Applies to the generated output. Input is parsed with or without separators.
Strictly one byte per character
This page defaults to the classic reading: each pair of hex digits is one character code from the ASCII table. That is the interpretation used in textbooks, embedded protocol documentation, CTF puzzles and legacy systems — and it is deliberately different from the UTF-8 default on our hex-to-text page, where one character can span up to four bytes.
The ASCII ranges worth memorising
| Hex range | Decimal | Contents |
|---|---|---|
| 00–1F | 0–31 | Control codes: 09 tab, 0A line feed, 0D carriage return, 1B escape |
| 20 | 32 | Space |
| 21–2F | 33–47 | Punctuation: !"#$%&'()*+,-./ |
| 30–39 | 48–57 | Digits 0–9 — note the digit is the low nibble |
| 41–5A | 65–90 | A–Z |
| 61–7A | 97–122 | a–z, exactly 0x20 above the capitals |
| 7F | 127 | Delete |
Two patterns fall straight out of that layout. The ASCII code of a digit is 3
followed by the digit itself, so 37 is 7. And case is a single bit:
41 is A, 61 is a — add or subtract 0x20 to
flip it.
Bytes above 7F
True ASCII stops at 7F. Anything higher depends entirely on what encoding the source used:
- Latin-1 / Windows-1252 — one byte per character;
E9isé. - UTF-8 — the byte is part of a multi-byte sequence;
C3 A9isé. - A code page — the same byte means something different again.
- Not text — it may simply be binary data.
If your decoded output looks like é or ’, you are reading UTF-8
bytes one at a time. Switch the character set.
Working with hex dumps
A dump from xxd, hexdump -C or Wireshark has three columns: an
offset, the hex bytes, and an ASCII rendering with dots for unprintable characters. Only the
middle column is data. Paste the offsets in by accident and they decode as extra characters —
a very common source of confusion when a decoded string comes out slightly wrong at the start
of every line.
Control characters in the output
Bytes below 0x20 have no visible glyph, so a decoded string containing them may look shorter
than it is or break across lines unexpectedly. That is usually the point: finding a stray
0D, an embedded 1B escape sequence, or a 00 terminator
inside what was supposed to be plain text.
Questions
What is the difference between this and the hex-to-text page?
This one defaults to a strict one-byte-per-character reading, which is what people mean by ASCII. The text page defaults to UTF-8, where one character can span up to four bytes.
Which hex values are printable ASCII?
20 to 7E — space through tilde. Below 20 are control codes such as 09 tab, 0A line feed and 0D carriage return; 7F is delete; anything above is outside ASCII proper.
My data has bytes above 7F. What are they?
They are not ASCII. Read as Latin-1 they map to accented characters and symbols; read as UTF-8 they are part of a multi-byte sequence. Switch the character set to UTF-8 if the source was modern text.
Why do I get 48 65 6C 6C 6F for "Hello"?
Those are the ASCII codes 72, 101, 108, 108, 111 written in base 16. Hex is just a compact way of writing the same byte values a decimal ASCII table shows.