Base58 Encoder/Decoder
Encode and decode Base58 with the Bitcoin/IPFS alphabet — leading zeros preserved, entirely on this device.
Press ? for shortcuts
Do it offline:$ bx base58-decode StV1DL6CwTryKyV
How to use it
- Paste Base58 into the input pane. Decoding runs as you type, and wrapped pastes still work — skipped whitespace is declared as a chip.
- Read the classified result: clean UTF-8 stays text, while binary payloads such as a decoded address land under the Decoded bytes — hex label.
- Switch direction with the Encode tab or the s key, and pick Text or Hex input; a Base58-shaped paste raises the clickable Detected: Base58 badge.
- Copy, download, or share the tool state as a link. Credential-shaped pastes — a WIF or xprv private key — are never stored between visits.
Paste a Base58 string — a Bitcoin address, an IPFS CIDv0, a wallet key — and the decoded bytes appear as you type: clean UTF-8 renders as text, anything else switches to a labelled hex view. Encode runs the other way, from text or hex bytes. Leading zeros survive as leading 1 characters, tolerances surface as chips, and no input leaves this device.
How it works
Base58 treats your entire input as one big integer. Encoding divides that integer by 58 repeatedly, emitting one alphabet character per remainder; decoding folds characters back with multiply-and-add. With no fixed-size blocks, nothing converts independently and cost grows roughly with the square of the length. Hence the 16 KB ceiling: addresses, keys and content hashes fit thousands of times over; past it the tool refuses rather than stalls.
Pure arithmetic would erase real data: a 0x00 byte at the front adds nothing to the integer's value. The convention keeps each alive as a literal 1 — the alphabet's zero digit — which is why a Bitcoin mainnet address begins with 1. The four look-alike characters are dropped by design; the comment atop Bitcoin's base58.h records why, and this page inherits it unchanged.
Examples
StV1DL6CwTryKyVhello worldThe classic sample: fifteen Base58 characters carrying eleven bytes of clean UTF-8 — the result stays in the text pane.
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93The Bitcoin genesis address: 25 bytes of non-UTF-8 output shown as hex, the leading 1 becoming the 00 version byte — counted by a chip.
516b6fcd0fABnLTmgEncode from hex: five bytes in, seven characters out. This exact pair ships in Bitcoin Core's base58_encode_decode.json, the provenance of this page's golden vectors.
café ☕2GNQTrXRsY4dAEncode from text: six visible characters become nine UTF-8 bytes first; decoding restores the accent and emoji exactly.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Ten 1s are ten zero bytes
1111111111 decodes to 00000000000000000000 — ten bytes, value zero — and the chip counts them. Encode those hex bytes and the ten 1s return. Only the front is special; zeros elsewhere are ordinary digits.
CIDv0 pastes decode to a multihash
A 46-character IPFS identifier starting Qm decodes to 34 bytes beginning 1220 — the sha2-256 code (0x12) and 32-byte digest length (0x20). You get raw bytes; multihash parsing is a different job.
Wrapped pastes work, and say so
Values copied from emails and terminals arrive wrapped. ASCII whitespace is skipped with the chip whitespace was ignored, and error positions still count against your original paste.
No look-alike folding, on purpose
Crockford Base32 folds O into 0; Bitcoin Base58 refuses instead, because silently repairing an address would yield a different, equally plausible one. Excluded look-alikes raise a position-anchored error, never a guess.
A + or = in the input means Base64
The two encodings are easy to swap by accident, but +, / and = never occur in Base58 — the error names the mix-up and points at the Base64 decoder.
Address bytes end in a checksum this page ignores
Behind an address sit a version byte, a 20-byte hash and four checksum bytes; verifying that tail is Base58Check's job. This tool decodes a mistyped address without complaint — nothing validates checksums today.
Common errors
`0` is not a Base58 character (position 3). The Bitcoin alphabet excludes 0, O, I and l because they look alike.- Usually a hand-transcribed value: a zero typed where the letter o belongs, or hex pasted into the decode pane. Nothing is folded — fix position 3 against your source.
`+` is not a Base58 character (position 8). This looks like Base64, not Base58 — try the Base64 decoder.- Base64 pastes are the most common wrong-tool visit here, and +, / or = is the giveaway. The input stays untouched, so moving it costs one copy.
Input is larger than the 16 KB limit for this tool. For bigger payloads use the CLI: bx base58-decode <base58>- Above 16 KB the big-integer arithmetic would stall rather than stream, so the tool refuses outright — never truncates. Real payloads sit far below the cap.
FAQ
Why does Base58 exclude 0, O, I and l?
In many fonts those four glyphs look nearly identical, and Base58 values are what people re-type from screens and paper. Bitcoin's base58.h comment states the goals: no glyph pair that lets two visually identical strings differ, and letters-and-digits only so a double-click selects the whole value. Base62 minus those four leaves 58.
What is the difference between Base58 and Base58Check?
Base58Check is Base58 plus integrity: a version byte in front and the first four bytes of a double SHA-256 appended, so a wallet can reject a mistyped address. This page is the raw encoding only — checksum bytes show in the hex output, but nothing verifies them.
Why do Bitcoin addresses start with 1?
A mainnet pay-to-pubkey-hash address encodes a payload whose first byte is 0x00. Zero bytes at the front would vanish in the integer conversion, so each is written as a literal 1, the alphabet's first character. That 1 is data — remove it and the bytes lose their version byte.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Re-run the current input immediately.
- ⌘/Ctrl + S
- Download the output (.txt), not the web page.
- ⌘/Ctrl + C
- Copy the result while nothing is selected.
- ⌘/Ctrl + Shift + C
- Force-copy the result over an active selection.
- s
- Swap between Encode and Decode (outside text fields).
- t
- Cycle the theme (single-key, kill switch honored).
- ? or ⌘/Ctrl + /
- List every binding this page registers.
- Esc
- Close the open dialog without touching input.