Base58 Bitcoin Encoder/Decoder

Bitcoin-style Base58 encoding — no 0, O, I, l confusion

Encode and decode using Bitcoin's Base58 alphabet, which omits the visually ambiguous characters zero, capital O, capital I and lowercase L. Big-integer base conversion preserves leading zero bytes as leading ones, and everything runs in your browser. It runs free in your browser on Gera Tools, with nothing uploaded.

Last updated Source: Gera Tools

Which characters does Bitcoin Base58 leave out, and why?

It omits four characters that are easy to confuse when read or transcribed by hand: the digit zero, the capital letter O, the capital letter I, and the lowercase letter L. Removing them prevents costly typos when someone copies an address or key by eye.

Base58 is a binary-to-text encoding introduced by Bitcoin to represent addresses and keys in a form that humans can copy without errors. It uses 58 symbols, deliberately dropping the four characters that look alike in many fonts. This tool encodes UTF-8 text to Bitcoin Base58 and decodes it back, entirely in your browser.

How it works

Unlike Base64, Base58 does not work on fixed bit groups. It treats the entire input as one large integer and repeatedly divides by 58:

  1. The input bytes are interpreted as a big-endian number.
  2. That number is divided by 58 over and over; each remainder selects one symbol from the alphabet 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz.
  3. The symbols come out least-significant first, so they are reversed for the final string.
  4. Each leading zero byte in the input is encoded separately as a leading 1, because the numeric conversion alone would lose it.

Decoding runs the same process in reverse: characters are accumulated into a big integer, the integer is rendered back into bytes, and each leading 1 is restored as a zero byte.

Worked example and notes

Encoding the text Hello World! produces a compact Base58 string. Because Base58 omits 0, O, I, and l, a string that contains any of those characters is invalid and the decoder will reject it with the offending character named clearly.

Base58 versus other compact encodings

EncodingCharactersAvoids look-alikesURL-safeUse case
Base64A–Z, a–z, 0–9, +/NoNo (needs URL-safe variant)General binary-to-text
URL-safe Base64A–Z, a–z, 0–9, -_NoYesTokens, JWTs
Base58 (Bitcoin)1–9, A–H, J–N, P–Z, a–k, m–zYesYesAddresses, keys
Base58 (Ripple)Different ordering of same 58 charsYesYesXRP addresses
Base620–9, A–Z, a–zNoYesShort IDs, URLs

Base58 trades the simplicity of bit-grouping (as Base64 uses) for a human-readable, unambiguous output. The big-integer division approach means encoding and decoding are slightly slower than Base64 for large inputs, but for the short values Base58 is designed for — keys, addresses, identifiers — the difference is imperceptible.

Base58 vs Base58Check

A real Bitcoin address is not raw Base58. It is Base58Check: the version-prefixed payload is hashed with SHA-256 twice, the first four bytes of that double-hash are appended as a checksum, and the whole thing is then Base58-encoded. If you mistype one character of a real Bitcoin address, the checksum fails and the wallet rejects it rather than sending funds to the wrong place.

This tool encodes raw Base58 without a checksum — it is the underlying primitive. If you need Base58Check encoding with a four-byte double-SHA-256 guard, see the Ripple Base58 tool, which exposes the checksum layer explicitly.

Remember that this tool treats your input as UTF-8 text. Bitcoin tooling typically treats inputs as raw hex byte sequences. If you are building wallet-layer software, feed the raw bytes (as hex) rather than a text string to get a result that matches what a Bitcoin library would produce.