Base32, Base58 and Base85 are binary-to-text encodings like Base64, each with a different alphabet and trade-off. This tool decodes all three back into bytes and shows them as text and hex.
Example
Base32, with the default Base32 (RFC 4648) variant:
JBSWY3DPEBLW64TMMQQQ====Hello World!The same text in the other two variants: Base58 JxF12TrwUP45BMd decodes to Hello World (no !), and ASCII85 87cURD]i,"Ebo80 decodes to Hello World!.
The three encodings
Base32 (RFC 4648) uses A–Z and 2–7. It is case-insensitive and avoids 0, 1 and 8, which are easy to confuse with letters, so people can read it aloud and type it by hand. You will find it in TOTP 2FA secrets (the key behind an authenticator QR code), Tor .onion addresses and some file hashes. It costs about 60% extra space.
Base58 is the alphabet Bitcoin introduced. It drops 0, O, I and l, plus + and /, so an identifier can be copied off a screen without mistakes and double-clicks select the whole string. Bitcoin addresses, IPFS content IDs (CIDv0, starting Qm) and Solana addresses use it. Note that Bitcoin addresses use Base58Check, which appends a 4-byte checksum. That checksum appears as extra bytes at the end when you decode here.
Base85 (ASCII85) packs 4 bytes into 5 characters, so it only adds 25%. Adobe uses it in PostScript and PDF streams, where it is wrapped in <~ … ~>. A single z is shorthand for four zero bytes.
How to tell them apart
- Uppercase letters and digits 2–7, often with
=padding: Base32. - Mixed case, no
0,O,Iorl, no padding: Base58. - Lots of punctuation (
< > ; " ' ,) or wrapped in<~ ~>: Base85. - Mixed case with
+,/or=at the end: that is Base64. Use the Base64 decoder.
How to use the Base32 / Base58 / Base85 decoder
- Choose the encoding in the Variant menu.
- Paste the encoded string. Whitespace is ignored, and Base32 accepts lowercase.
- Read the decoded text, and use the hex view to check binary payloads such as keys or hashes.
Decode in code
import base64
print(base64.b32decode("JBSWY3DPEBLW64TMMQQQ====").decode()) # Hello World!
print(base64.a85decode('87cURD]i,"Ebo80').decode()) # Hello World!// Base58 has no built-in decoder; this is the standard big-number conversion
const A = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
function base58Decode(s) {
let n = 0n;
for (const c of s) n = n * 58n + BigInt(A.indexOf(c));
let hex = n.toString(16);
if (hex.length % 2) hex = "0" + hex;
const lead = s.match(/^1*/)[0].length; // each leading "1" is a zero byte
return Buffer.concat([Buffer.alloc(lead), Buffer.from(hex, "hex")]);
}
console.log(base58Decode("JxF12TrwUP45BMd").toString()); // Hello WorldBase32, Base58 and Base85 at a glance
| Base32 | RFC 4648, A–Z 2–7, = padding, about +60% size |
| Base58 | Bitcoin alphabet, no 0 O I l, about +37% size |
| Base85 | ASCII85, 5 characters per 4 bytes, +25% size |
| Case-sensitive | Base32 no; Base58 and Base85 yes |
Frequently asked questions
How do I decode a 2FA / TOTP secret?
TOTP secrets are Base32. Choose Base32, paste the secret (spaces are ignored) and you get the raw key bytes. The result is binary, so read it in the hex view rather than as text.
Why does my Bitcoin address decode to strange bytes?
A Bitcoin address is Base58Check: one version byte, a 20-byte hash and a 4-byte checksum. None of it is text, so the hex view is the useful output. The first byte is 00 for legacy 1… addresses and 05 for 3… addresses.
Is Base32 the same as Crockford Base32?
No. Crockford's variant uses a different alphabet (0–9 plus letters, without I, L, O and U). It is used by ULIDs, for example. This tool decodes RFC 4648 Base32. To read a ULID, use the ULID / Snowflake decoder.
Last reviewed · found a mistake? contact@decoder.tools · view as markdown