Home Tools Blog About

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 "é").

Enter hex bytes to decode.
🛡
100% PrivateNo server uploads, ever
InstantRuns in your browser
💧
No WatermarksClean output, always
🆓
Free ForeverNo accounts, no limits

How to Use Convert Hex to String

  1. Paste your hex bytes, in any common format - continuous (48656C6C6F), space-separated (48 65 6C 6C 6F), comma-separated, or with 0x prefixes. Case-insensitive; underscores also stripped.
  2. 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.
  3. Choose non-printable handling: Escape emits x0A for each byte outside 32-126; Placeholder uses ·; Raw emits the literal control char (careful - may corrupt display).
  4. Toggle strict mode if you want invalid sequences to fail instead of producing U+FFFD replacement characters. Useful when validating suspect data.
  5. Enable batch mode if each line of input is a separate hex sequence.
  6. Press Convert (or Ctrl+Enter / Cmd+Enter). Auto-convert also runs 200 ms after each keystroke.
  7. Read the stats line: bytes in, characters out, and non-printable count. Copy puts the decoded text on your clipboard; Download saves a .txt file.

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.

Keep going

Related Tools

All Hex tools →