What is Hex to Text Converter?
A Hex to Text Converter converts Hex into Text directly in your browser. It parses the source format, applies the standard mapping or formula, and outputs the target format ready to copy. Decode a hex byte sequence (with or without spaces) back to UTF-8 text.
Hex to Text Converter
Convert hexadecimal byte sequence back to text. UTF-8 aware.
TLDR
Paste hex (with or without spaces), click Convert. The tool parses pairs of hex digits as bytes and decodes them as UTF-8.
About hex-to-text conversion
Hexadecimal (hex) is the base-16 number system. It uses sixteen symbols, 0 through 9 then A through F, where A to F stand for the values 10 to 15. Hex is the standard shorthand for raw bytes because one byte (8 bits, values 0 to 255) maps to exactly two hex digits. This tool reverses that shorthand: paste a sequence of hex byte pairs and it decodes them back into readable text using UTF-8.
The reason hex is so common is that it is far more compact than binary and far more byte-aligned than decimal. The byte 255 is 11111111 in binary, 255 in decimal, but a tidy FF in hex. Programmers see hex everywhere: memory addresses, HTTP byte ranges, cryptographic hashes, MAC addresses, and CSS color codes like #FF6600. Each pair of hex digits is one byte, and each byte maps to a character through an encoding.
Decoding is deterministic. Strip anything that is not a hex digit, read the digits two at a time, convert each pair to a number from 0 to 255, and look the number up in UTF-8. Because the mapping is exact and case-insensitive, the same hex always yields the same text, and valid UTF-8 hex round-trips losslessly back to its original string.
How it works: the formula
The tool cleans the input to bare hex digits, reads them in pairs, and decodes the resulting byte array as UTF-8 with the browser's TextDecoder:
clean = input.replace(/[^0-9a-fA-F]/g, '') // keep only hex digits
// length must be even (2 digits per byte)
bytes = [];
for (i = 0; i < clean.length; i += 2)
bytes.push(parseInt(clean.substr(i, 2), 16)) // pair -> a number
text = new TextDecoder().decode(new Uint8Array(bytes)) // bytes -> UTF-8
parseInt(pair, 16) reads each two-character chunk in base 16; TextDecoder reassembles single- and multi-byte UTF-8 sequences into characters. It runs entirely on your device: open developer tools, watch the Network tab, and no requests fire while you decode.
Worked example: decoding "48 65 6c 6c 6f"
- Clean and pair. Removing spaces gives the pairs 48, 65, 6c, 6c, 6f (five bytes).
- Convert the first pair. 48 in base 16 = 4 x 16 + 8 = 72, which is the letter H.
- Convert the rest. 65 = 101 (e), 6c = 108 (l), 6c = 108 (l), 6f = 111 (o).
- Result: the text is
Hello(5 bytes decoded).
A multi-byte example: the pairs c3 a9 are decimals 195 and 169, which UTF-8 decodes as a single accented character, "e-acute". Two hex bytes, one visible letter.
Hex reference: bytes to characters
| Hex | Decimal | Character |
|---|---|---|
| 20 | 32 | (space) |
| 30 | 48 | 0 |
| 41 | 65 | A |
| 48 | 72 | H |
| 61 | 97 | a |
| 7a | 122 | z |
Common pitfalls
- Odd digit count. Hex must have an even number of characters because each byte is two digits. A missing or extra digit triggers an error; check for a dropped character.
- Including the 0x prefix or # sign. Markers like 0x or a leading # are not hex digits. They are stripped, but mixing them mid-stream can shift byte alignment, so remove them first.
- Confusing a hex color with hex bytes. A CSS color like FF6600 is three bytes that decode to control characters, not a readable word. Hex-to-text is for byte sequences that represent text.
- Assuming one byte equals one character. That holds only for ASCII. Multi-byte UTF-8 sequences (accents, emoji) need all their hex pairs present and in order.
- Worrying about letter case. Hex is case-insensitive: 4F and 4f are the same byte. No need to normalise before pasting.
Related tools
Frequently asked questions
What is hexadecimal?
Hexadecimal (hex) is base 16: it uses the digits 0 to 9 and the letters A to F to represent values 10 to 15. One byte (8 bits, values 0 to 255) fits neatly in exactly two hex digits, which is why hex is the standard way to write raw bytes. The byte 72 is 48 in hex, and the letter H. Hex is compact and human-readable, so it appears everywhere from memory dumps to color codes.
How does hex turn into text?
The tool strips non-hex characters, reads the digits in pairs (each pair is one byte from 0 to 255), and decodes the resulting byte sequence as UTF-8. The pair 48 is decimal 72, which is H; 65 is 101, which is e. Spaces between pairs are optional because the tool re-groups by two digits.
Why must hex have an even number of digits?
Each byte is exactly two hex digits, so the total number of hex characters must be even to split into whole bytes. An odd count means the last byte is incomplete, so the tool shows an error. Check for a missing or extra digit, or a stray non-hex character that was stripped.
Is uppercase or lowercase hex different?
No. Hex is case-insensitive: 4F and 4f are the same byte (79, the letter O). The tool accepts both and any mix. By convention lowercase is common in programming output and uppercase in formal specifications, but they decode identically.
Is my hex input sent anywhere?
No. Decoding uses the browser's built-in TextDecoder API and runs entirely on your device. Nothing is uploaded, logged, or stored, and the input is discarded when you close the tab. You can verify by checking the Network tab in developer tools while decoding.
