Convert decimal codes to text
Turn a list of decimal character codes into text and back, with UTF-8 or ASCII byte handling and any separator you like.
- Runs in your browser
- Nothing you enter is sent
- Free, no account
The converted value appears here.
Accents, CJK and emoji become multiple bytes each, exactly as they are stored on disk.
Applies to the generated output. Input is parsed with or without separators.
Decimal character codes
Some systems hand you a list of plain numbers instead of hex: 72 101 108 108 111.
Each is one byte, 0–255, and this page turns them back into text in either direction.
| Range | Contents | Anchors worth remembering |
|---|---|---|
| 0–31 | Control codes | 9 tab, 10 line feed, 13 carriage return |
| 32 | Space | The first printable code |
| 48–57 | Digits | 48 is 0, so 53 is 5 |
| 65–90 | A–Z | 65 is A |
| 97–122 | a–z | 97 is a, exactly 32 above A |
| 128–255 | Extended | Meaning depends entirely on the encoding |
Separators are not optional
Unlike hex, decimal byte values have no fixed width — 7, 72 and
255 are one, two and three digits. So 72101108 is genuinely
ambiguous. Use spaces, commas, semicolons or newlines; all are accepted. The one exception is
input where every value has been padded to three digits, which the parser can split reliably.
Codes above 255
If your list contains numbers like 8364 or 128512, they are not bytes — they are Unicode codepoints. 8364 is U+20AC, the euro sign; 128512 is U+1F600, the grinning face. This page works on bytes, so those values are rejected rather than truncated. Convert codepoints to UTF-8 bytes first, or use the hex tools, which show the multi-byte sequences directly.
Where these lists come from
- Spreadsheets — a column produced by
CODE()orUNICODE(). - Databases —
ASCII()output while hunting an encoding problem. - Teaching material — introductory exercises almost always use decimal.
- Microcontroller serial output —
Serial.println(byte)prints decimal by default, which is why Arduino logs look like this. - Puzzles and CTFs — a comma-separated list of numbers is the most common first-stage encoding there is.
Why 65 for A, and why the 32 gap
ASCII was designed so that operations were cheap in hardware. Capital A is
1000001 in binary and lowercase a is 1100001 — a single bit apart. Case
conversion was therefore one bitwise operation, and 32 is simply the decimal value of that
bit. The same thinking put the digits at 48–57, so the numeric value of a digit character is
its code minus 48.
Going the other way
Use the swap button to turn text into a list of decimal codes. In UTF-8 mode a single accented character produces two numbers and an emoji produces four, which is worth seeing at least once — it explains a great many “why is my string longer than I typed” bugs.
Questions
Are these character codes or byte values?
Byte values. In ASCII mode they are identical to character codes. In UTF-8 mode a single character can be two, three or four separate byte values, all shown in the list.
Do I need separators?
For decimal, yes — 72101108 could be read a dozen ways. Space, comma, semicolon and newline all work. If you pad every value to three digits you can also run them together.
What is the highest valid number?
255. Each value here is one byte. If your source has numbers above 255 they are Unicode codepoints rather than bytes — the character counter and hex pages handle those better.
Why is capital A 65 and lowercase a 97?
ASCII was laid out so the case bit is a single bit: 65 is 1000001 and 97 is 1100001. Flipping bit 6 changes case, which made early terminal hardware much simpler.