Convert Hex to String
Decode hex bytes to text with UTF-8, UTF-16, Latin-1, or ASCII encoding. Strict or lenient mode, non-printable handling, batch. Free, offline, client-side.
Decode a sequence of hex bytes into text using your chosen encoding - UTF-8 (default), Latin-1, UTF-16LE, UTF-16BE, or ASCII strict. Uses the browser's native TextDecoder, so multi-byte sequences like C3 A9 = "é" decode correctly (not "é").
How to Use Convert Hex to String
- Paste your hex bytes, in any common format - continuous (
48656C6C6F), space-separated (48 65 6C 6C 6F), comma-separated, or with0xprefixes. Case-insensitive; underscores also stripped. - Pick an encoding: UTF-8 is the default and correct choice for most modern data. Use Latin-1 for legacy single-byte systems; UTF-16LE/BE for Windows-style text; ASCII strict to enforce pure 7-bit content.
- Choose non-printable handling: Escape emits
x0Afor each byte outside 32-126; Placeholder uses·; Raw emits the literal control char (careful - may corrupt display). - Toggle strict mode if you want invalid sequences to fail instead of producing U+FFFD replacement characters. Useful when validating suspect data.
- Enable batch mode if each line of input is a separate hex sequence.
- Press Convert (or Ctrl+Enter / Cmd+Enter). Auto-convert also runs 200 ms after each keystroke.
- Read the stats line: bytes in, characters out, and non-printable count. Copy puts the decoded text on your clipboard; Download saves a
.txtfile.
Frequently Asked Questions
Why does my hex decode look like gibberish (“é” instead of “é”)?
You’re probably using the wrong encoding. UTF-8 encodes the character “é” as two bytes: C3 A9. If you decode those two bytes as Latin-1 (one char per byte), you get “Ô + “©” = “é”. Switch the Encoding selector to UTF-8 and you’ll get the single character “é” as intended.
How does this differ from “Hex to ASCII”?
ASCII is 7-bit only (bytes 0-127), one char per byte – simple. “String” is more general: it can mean UTF-8 (variable 1-4 bytes per char, today’s default), UTF-16 (2 or 4 bytes), or legacy Latin-1. This tool exposes an encoding selector; the ASCII tool hard-codes 7-bit interpretation. If your hex contains any byte > 0x7F, you almost certainly want this tool, not the ASCII one.
What do the four encoding options mean?
UTF-8 is the modern default – variable-width, backward-compatible with ASCII, used by the web and Unix. Latin-1 is fixed 1 byte per char, covering basic Western European letters. UTF-16LE/BE is 2 bytes per char (with surrogate pairs for supplementary planes), standard on Windows and in Java’s native strings. ASCII strict errors on any byte > 127.
What’s strict vs lenient mode?
In strict mode, invalid byte sequences for the chosen encoding (e.g., a lone 0xFF in UTF-8) trigger an error and stop decoding. In lenient mode (default), invalid bytes are replaced with the Unicode replacement character U+FFFD (shown as “�”). Use strict when validating data integrity; use lenient for best-effort recovery.
Why are there three options for non-printable bytes?
Because different workflows need different handling. Escape makes every control byte visible as xNN – best for debugging binary data. Placeholder (·) is cleanest for text that has occasional control chars you want to ignore visually. Raw preserves the original control chars – good when you’re piping into something that expects them (shells, parsers), dangerous when pasting into a browser textbox.
What happens with odd-length hex?
You get an error: “hex must have even number of digits”. Every byte needs 2 hex digits – odd-length input is ambiguous. Prepend or append a zero if you know which side you meant.
Does this tool handle UTF-16 surrogate pairs?
Yes – the browser’s native TextDecoder handles surrogate pairs correctly for both UTF-16LE and UTF-16BE. A surrogate pair (4 bytes in UTF-16) decodes to the single supplementary-plane character it represents (emoji, rare scripts, etc.).
How big can my input be?
Practically unlimited. The algorithm is O(n) and TextDecoder is browser-optimized. 1 MB of hex (500,000 bytes of input data) decodes in under 50 ms on a modern laptop. Very large pastes may take a moment to render in the output textarea but decoding itself stays fast.
Is my hex data uploaded anywhere?
No. All decoding runs in your browser’s JavaScript engine via the native TextDecoder API. No network requests fire during conversion, no server stores or logs your hex. You can verify with your browser’s Network tab. The tool works offline after the initial page load.
How do I go from text back to hex?
Use our “String to Hex” converter. The browser’s TextEncoder encodes the string to UTF-8 bytes by default; for other encodings, you’d need manual byte-level handling. Round-trips are lossless as long as the input text is valid for the chosen encoding.
Related Tools
Convert String to Hex →
Convert text to hex (UTF-8) and back with per-character breakdown. 4 separator formats. Free,…
Add Hex Numbers →
Add Hex Numbers instantly. Free, offline, client-side tool that outputs results in both hex…
ASCII to Hex Converter →
Convert ASCII to Hex - code points or UTF-8 bytes, space/comma/0x-prefixed, uppercase or lowercase.…
Base32 to Hex Converter →
Base32 to Hex Converter - pick separator, case, and prefix. Free, client-side, instant, offline,…
Base58 to Hex Converter →
Decode Bitcoin, Ripple, or Flickr Base58 strings to hex - with separator, case, and…
Base64 to Hex Decoder →
Decode Base64 to hex bytes - URL-safe variant, separator options, uppercase toggle, UTF-8 aware.…