Skip to content

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
Hex → ASCII text
Conversion runs as you type. Use Swap to send the result back into the input and reverse the direction.

The converted value appears here.

Options

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.

Load a text file
Drop a .txt containing hex values and they are parsed straight away.
Drop a file hereRead locally with the File API — nothing is uploaded.Any file · up to 64 MB each

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 rangeDecimalContents
00–1F0–31Control codes: 09 tab, 0A line feed, 0D carriage return, 1B escape
2032Space
21–2F33–47Punctuation: !"#$%&'()*+,-./
30–3948–57Digits 0–9 — note the digit is the low nibble
41–5A65–90A–Z
61–7A97–122a–z, exactly 0x20 above the capitals
7F127Delete

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; E9 is é.
  • UTF-8 — the byte is part of a multi-byte sequence; C3 A9 is é.
  • 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.