如何解码 Base58
- 把字符串粘贴到 输入 · Base58 中。空格和换行会被忽略。
- 在 输出 · Hex 中读取字节。在输出下方可以切换 大小写,添加空格或
:等 分隔符,或按 16 或 32 每行字节数 拆分输出。 - 如果字符串不是比特币风格的 Base58,请把输入下方的 字母表 改为 Flickr 或 Ripple。
- 需要其他形式时,修改 到:数据原本是字符串就选 文本,用于 API 或配置文件就选 Base64。Base58 转 Base64 是专门为这种转换准备的页面。
- 点击 复制输出、下载 hex,或者用 保存字节 把解码后的字节保存为文件。
常见 Base58 字符串解码后是什么
| Base58 | 字节(hex) | 含义 |
|---|---|---|
11111111111111111111111111111111 | 32 × 00 | Solana System Program(全零的 32 字节密钥) |
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 06ddf6e1d765…7eff00a9(32 字节) | Solana SPL Token 程序 ID |
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 00 62e907b1…ebb88f18 c29b7d93 | 比特币创世区块地址:版本、哈希、校验和 |
QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq | 1220 262a86b6…e0882d8a | IPFS CIDv0:SHA-256 multihash 头部和 32 字节摘要 |
9Ajdvzr | 48656c6c6f | 文本 Hello |
读出字节就能看出结构。以 00 或 05 开头的 25 字节结果,是仍带着校验和的比特币地址;以 1220 开头的 34 字节结果是 CIDv0;看不出结构的 32 字节,最有可能是公钥。
开头的 1 就是零字节
在 Base58 中,每个开头的 1 都解码为一个 00 字节,字符串的其余部分则作为一个整数解码。本解码器会保留这些字节,所以上面的创世区块地址返回 25 个字节,而不是 24 个。只转换数字的解码器会丢掉它们,最先出现的症状通常是密钥少了一个字节,或者校验和永远对不上。
这条规则反过来也成立:1111 是四个零字节,而 2 是单个字节 01。
解码失败的情况
- 意外字符
"0"、"O"、"I"或"l"。这四个字符不在 Base58 字母表中,因为它们和别的字符长得太像而被排除了。错误提示会给出位置;通常是抄写错误。 - 意外的
+、/或=。这个字符串是 Base64。请使用 Base64 解码器。 - 输入以
bc1开头。这是 Bech32 格式的 SegWit 地址,是另一种编码,有自己的校验和与字母表。它在这里要么报错,要么解码出无意义的字节。 - hex 是对的,但多了 4 个字节。你把 Base58Check 值当作普通 Base58 解码了。最后 4 个字节是校验和;去掉它们,或者使用 Base58Check。
- 输入超过 64 KB。Base58 把整个输入当作一个数字处理,所以工具在 64 KB 处停止,以保持页面流畅。实际的 Base58 值只有几十个字符。
在 JavaScript 中把 Base58 解码为 hex
有了 BigInt,转换代码很短。浏览器和 Node.js 中都可以运行:
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
function base58ToHex(s) {
let n = 0n;
for (const ch of s) {
const v = ALPHABET.indexOf(ch);
if (v < 0) throw new Error(`not Base58: ${ch}`);
n = n * 58n + BigInt(v);
}
let hex = n === 0n ? "" : n.toString(16);
if (hex.length % 2) hex = "0" + hex;
const zeros = s.length - s.replace(/^1+/, "").length;
return "00".repeat(zeros) + hex;
}
base58ToHex("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa");
// '0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93'
更多 JavaScript 字节处理见 JavaScript 页面。
常见问题
如何解码 Solana 地址?
粘贴到这里即可:hex 输出就是 32 字节的 Ed25519 公钥。System Program 的地址 11111111111111111111111111111111 解码为 32 个零字节,可以直观地看到前导零规则的作用。
为什么我的比特币地址解码后是 25 个字节?
传统地址是 Base58Check:1 个版本字节、20 字节的公钥哈希和 4 字节的校验和。普通的 Base58 解码会返回全部 25 个字节。Base58Check 解码器会帮你验证并去掉校验和。
为什么解码器拒绝我的字符串?
Base58 中没有 0、O、I 和 l,出现其中之一通常意味着输错了,或者是另一种编码。含有 +、/ 或 = 的字符串是 Base64,0x… 则是 hex。
如何在 JavaScript 中把 Base58 转换为 hex?
用 BigInt 逐位累乘,用 toString(16) 输出,然后为每个开头的 1 补上 00。本页的代码片段给出了完整的函数。