Overview
Decode a hex string into readable UTF-8 text, or run the reverse and encode text into hex. This is not a number-base conversion - a hex string here represents a sequence of raw bytes (each pair of hex digits is one byte), not one large hex integer, so decoding reads it two digits at a time into a byte array and then runs that array through the browser's native `TextDecoder` in strict UTF-8 mode. That matters because UTF-8 is variable-width: a character like the euro sign "€" takes three bytes ("E282AC"), and many emoji take four, so converting hex digit-pairs one at a time as if each were its own character would silently produce garbage the moment a multi-byte character shows up. Invalid hex (non-hex characters, odd digit count) and valid-hex-but-invalid-UTF-8 byte sequences are reported as two distinct, specific errors rather than one vague failure. Accepts a contiguous hex string ("48656C6C6F"), one with spaces, or a "0x"-prefixed value - all equivalent. Runs entirely client-side.
Best for: Decoding a hex-encoded payload (from a hash, log, or hex dump) back into readable text
How to use this tool
- Choose a direction. Hex to UTF-8 text, or text to hex.
- Paste your hex or text. Hex can be contiguous, spaced, or 0x-prefixed - all are normalized automatically.
- Read two digits as one byte. Each hex pair becomes a raw byte; the full byte sequence is then decoded as UTF-8.
- See the result and byte count. Decoded text (or hex output) appears immediately, along with the number of bytes involved.
Frequently asked questions
A hex-encoded string represents a sequence of independent bytes, not a single numeric value - "48656C6C6F" is the five bytes 48, 65, 6C, 6C, 6F (spelling "Hello" in ASCII), not the huge integer you'd get parsing the whole string as one hex number. Number-base converters intentionally do the latter; this tool does the former, since that's what hex means when it's standing in for text or binary data.
It's handled correctly: "E282AC" (three bytes) decodes to the single euro sign character "€", and a 4-byte emoji sequence decodes to one emoji - because decoding runs the full byte array through `TextDecoder`, which understands UTF-8's variable-width encoding, rather than converting each byte to a character on its own.
It's rejected immediately with a specific error, since a byte is always two hex digits - an odd count means the input is truncated or malformed, and guessing how to pad it would risk decoding the wrong bytes.