Upload a file
  1. base64hub
  2. Other bases
  3. Hex to text

Hex to Text, ASCII and String Converter

Paste hex bytes such as 48 65 6c 6c 6f to read the text they spell. Spaces, colons, 0x and \x prefixes are all accepted, and UTF-8 is assumed until you pick another charset.

Free no sign-up, no limits Local nothing uploaded 27 charsets, from ASCII to Shift_JIS Updated Oct 27, 2026
Input 0Bytes 0 BOutput 0

Processed in your browser. This page cannot send your data anywhere – how we know

How to convert hex to text

  1. Paste the hex into Input · Hex. Upper or lower case, with or without separators.
  2. The text appears in Output · Text while you type. Untick Live if you would rather convert with Run.
  3. If the output shows �, open Charset under the output and try another one. UTF-8 is the default; ASCII, Latin-1, Windows-1252 and 23 more are in the list.
  4. Use Copy output or Download for the text. If the hex is a dump of a file rather than text, Save bytes writes the raw bytes to disk with an extension guessed from the content.

The Text → Hex toggle above the tool flips the direction, or go to Text to Hex.

Hex formats the converter reads

Hex shows up in many spellings depending on the tool that produced it. All of these decode to Hello:

FormatExampleTypical source
Plain48656c6c6fxxd -p, sha256sum, database dumps
Spaced48 65 6c 6c 6fWireshark, hex editors
Colons48:65:6c:6c:6fcertificate fingerprints, openssl output
Dashes48-65-6C-6C-6F.NET BitConverter.ToString
0x prefix0x48 0x65 0x6c 0x6c 0x6f or 0x48656c6c6fC source, debuggers
\x escapes\x48\x65\x6c\x6c\x6fPython, shell scripts, logs

Commas, semicolons and dots work as separators too. Paste only the hex columns: the default xxd view starts each line with an offset such as 00000000: and ends with an ASCII column, so the converter would read the offset as bytes and then report an error at the first letter of the ASCII column. Run xxd -p to get plain hex instead.

How to read hex as ASCII

Each pair of hex digits is one byte, and in ASCII each byte below 80 is one character. The ranges worth remembering:

HexCharacters
20space
30–39digits 0–9
41–5AA–Z
61–7Aa–z
21–2F! " # $ % & ' ( ) * + , - . /
0A, 0Dline feed and carriage return (0D 0A is a Windows line break)

Upper and lower case letters are exactly 20 apart: 41 is A, 61 is a. With that and the table you can read short hex by eye. 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 is Hello, world: 2c is the comma and 20 the space.

Hex to UTF-8: bytes from 80 to FF

Anything outside basic English takes more than one byte in UTF-8, and those bytes are all 80 or higher. The same bytes give different text depending on the charset you read them with:

HexRead as UTF-8Read as Windows-1252
63 61 66 c3 a9cafécafé
e2 82 ac€â‚¬
f0 9f 91 8b👋👋
63 61 66 e9caf�café

The first three rows are UTF-8 data; the last is Latin-1 or Windows-1252 data, where é is the single byte e9. A run of à and â characters almost always means UTF-8 bytes read with a single-byte charset. If no charset gives sensible text, the bytes probably are not text at all: check Looks like in the status line, which names the format when it recognizes one.

Hex, Base64 and the same bytes

Hex spends two characters per byte and Base64 four characters per three bytes, so Base64 is a third shorter for the same data. If what you have starts with something like SGVsbG8 and contains letters past f, it is Base64: decode it with Base64 to Text. To re-encode hex bytes as Base64 for an API or a config file, use Hex to Base64. The comparison of hex, Base32, Base58 and Base85 covers when each one is used.

Hex to string in code

bytes.fromhex("48656c6c6f").decode("utf-8")       # 'Hello'
bytes.fromhex("48 65 6c 6c 6f").decode("utf-8")   # spaces are fine: 'Hello'

bytes.fromhex skips spaces but rejects colons and 0x, so strip those first. In Node.js:

Buffer.from("48656c6c6f", "hex").toString("utf8");   // 'Hello'
Buffer.from("48zz65", "hex");                         // <Buffer 48>

The second line shows a trap: Buffer.from stops at the first character that is not hex and returns what it has so far, without an error. More patterns are on the Python and Node.js pages.

FAQ

How do I convert hex to ASCII?

Paste the hex and read the output. ASCII only covers bytes 00 to 7F, so set Charset to ASCII if you want anything above that to show up as � instead of being read as UTF-8.

What is 48 65 6c 6c 6f in text?

Hello. 48 is H, 65 is e, 6c is l (twice) and 6f is o.

Why does my hex turn into é or other odd characters?

The bytes are UTF-8 and are being read as Latin-1 or Windows-1252, or the other way round. c3 a9 is é in UTF-8 and é in Windows-1252. Switch Charset until the text reads correctly.

What does "odd number of hex digits" mean?

Every byte is two hex digits, so the total must be even. One digit was lost while copying, often at the start or the end. Check the first and last pair of the input.

Can I link to a conversion?

Yes. Add #in= and the hex to the page address, for example /hex-to-text/#in=48656c6c6f. The part after # stays in the browser and is not sent to the server.