Security FIELD NOTES · 3 MIN READ
Hex Encoding Explained: See Any Text as Raw Bytes
How hex encoding turns text into byte pairs — UTF-8 surprises included — plus the formatting options (0x, spaces, uppercase) that match your target system.
Hexadecimal is how programmers read raw bytes without a machine between them and the data: every byte becomes exactly two characters from 0–9 and A–F. Text that looks like Hello is, at the byte level, 48 65 6C 6C 6F. The Hex Encoder & Decoder moves between those two views in either direction, with formatting options that match whatever target system you are feeding.
Two digits per byte, with formatting to match
Encoding walks the text byte by byte and prints each byte as a two-digit hex pair; a byte ranges from 0 to 255, which is exactly what two hex digits can express. Hi! becomes 486921 — H is 0x48, i is 0x69, ! is 0x21. The output options exist because different ecosystems write hex differently: uppercase on gives 48 65 6C 6C 6F the way spec sheets and protocol documents print it, the space separator matches hex dumps, the plain 0x prefix matches source-code literals (0x486921), and the per-byte 0x-byte style gives 0x48 0x65 0x6c 0x6c 0x6f the way byte arrays are written in code. Pick the style your destination expects and the output pastes in without cleanup.
Why é becomes two bytes
Hex encoding is UTF-8 encoding made visible. Plain ASCII costs one byte per character, but everything outside it costs more: café encodes to 636166c3a9 — five bytes for four characters, because é is stored as the two-byte UTF-8 sequence c3 a9. That is the tool's most useful side effect: paste text and you are looking at your actual bytes, so encoding surprises become visible immediately. When a string misbehaves in a database, an API, or a file format, comparing its hex form against what you expected is often the fastest way to find where the bytes stopped being what you thought they were.
Decode mode forgives messy input
Real-world hex arrives messy, and decode mode expects that. It strips 0x prefixes, \x escapes, and all whitespace before reading, so 0x48 0x65 0x6c 0x6c 0x6f, \x48\x65\x6c\x6c\x6f, and 48656c6c6f all decode to Hello. Two rules remain: hex digits must be valid (0–9, a–f), and the cleaned string must have an even number of digits, because half a byte cannot become a character — an odd-digit input is rejected with an error rather than silently misread. Decoding is byte-exact and lossless: 636166c3a9 comes back as café, multi-byte sequences and all.
Hex among the text encodings
Hex and Base64 both turn bytes into text, and the trade is size versus readability. Hex doubles the length (one byte becomes two characters) but keeps every byte human-readable and individually addressable, which is why memory dumps, checksum displays, and protocol traces are hex. Base64 grows data by only about a third and packs denser, at the cost of opacity — you cannot eyeball a Base64 string's bytes. The rest of the encoding family is compared in Beyond Base64. Note what hex is not: a transparent, reversible notation with no key and no one-way step — the opposite of the digests described in How Hashing Works.
Try it yourself
Open the Hex Encoder & Decoder and encode Hello with uppercase and spaces on to get 48 65 6C 6C 6F, then switch to the per-byte 0x style. Encode café and find the two-byte c3 a9 sitting in the output. Flip to decode and paste the messiest hex you have — mixed 0x prefixes, stray spaces, escaped form — and watch it clean up to plain text. To see the same bytes in another numeral system, the Base Converter translates individual values between hex, decimal, and binary.