Base58 编码解码

将文本、十六进制字节或小文件转换为 Base58,也可以反向解码。可选择 Bitcoin、Flickr 或 Ripple 字母表,并可添加或校验 Base58Check 校验和。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 选择“编码”把文本或字节转换为 Base58,或选择“解码”把 Base58 字符串还原为数据。
  2. 选择字母表。默认的 Bitcoin 字母表同样用于 IPFS 和 Solana。
  3. 输入或粘贴内容。如果是哈希、公钥等原始字节,请把输入方式切换为“十六进制”。
  4. 只有当字符串带有 4 字节校验和时才需要开启 Base58Check,然后复制或下载结果。

什么是 Base58?

Base58 是为比特币设计的二进制转文本编码。它的字母表由数字和拉丁字母组成,但去掉了四个容易看错的字符:0(数字零)、O(大写 o)、I(大写 i)和 l(小写 L)。字母表中也没有 +、/、=,因此双击就能选中整个字符串,放进 URL 也无需转义。

与 Base64 不同,Base58 不按位分组,而是把整个输入当作一个大整数,用 58 进制表示。因此它没有填充,改动一个字节可能会影响很多输出字符。开头的零字节在数值上没有意义,为了保留它们,每个前导零字节都会写成字母表的第一个字符(Bitcoin 字母表中是 1)。编码结果约为原数据的 1.37 倍。

Base58 的常见用途

  • 比特币。传统地址和 WIF 私钥采用 Base58Check,即带版本字节和校验和的 Base58。
  • IPFS。CIDv0 内容标识符是 SHA-256 多重哈希(multihash)的 Base58 形式,所以这类 CID 长度为 46 个字符,并以 Qm 开头。
  • Solana。公钥、账户地址和交易签名都使用不带校验和的普通 Base58。32 字节的公钥通常编码为 43 或 44 个字符。
  • Flickr 和 XRP Ledger。Flickr 短链接使用 Flickr 字母表;XRP 地址使用 Ripple 字母表,这也是它们以 r 开头的原因。

如果要在 Base58 和原始字节之间转换,可以使用 Base58 转十六进制 和 十六进制转 Base58。如果只需要由字母和数字组成的 ID,也可以了解 Base62。

Base58 字母表

字母表字符(按顺序)
Bitcoin123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Flickr123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
Ripplerpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

三种字母表包含相同的 58 个字符,只是顺序不同。用一种字母表编码的字符串,换成另一种字母表解码会得到不同的字节,或者直接报错。

在代码中使用 Base58

# Python(pip install base58)
import base58
base58.b58encode(b'hello')      # b'Cn8eVZg'
base58.b58decode('Cn8eVZg')     # b'hello'

// JavaScript(npm install bs58)
import bs58 from 'bs58';
bs58.encode(new TextEncoder().encode('hello'));

编码规格

字母表1-9 A-Z a-z,去掉 0 O I l
输出体积约 137%(大数进制转换)
填充无(前导零字节编码为 1)
标准Bitcoin Base58
区分大小写是

编码示例

输入 (UTF-8)输出
Hello, World!72k1xXWG59fYdzSNoA
Base64.isr1Nm3AS7ZcnN
你好2xuZUfBKa

常见问题

为什么前导零字节会变成 1?
Base58 把输入转换成一个整数,而开头的零字节不会改变这个数值。为了保留它们,每个前导零字节都写成字母表的第一个字符,在 Bitcoin 字母表中就是 1。所以 32 个零字节会编码成 32 个连续的 1。
Base58 区分大小写吗?

区分。大写和小写字母代表不同的数值,改动任意一个字符的大小写都会改变解码结果,或者让字符串变得无效。

Base58 和 Base58Check 有什么区别?
Base58Check 在编码前追加 4 字节校验和(双重 SHA-256 哈希的前 4 个字节),用来发现输入错误。在本页开启 Base58Check 选项即可使用,详细说明见 Base58Check 页面。
为什么输入限制在约 20 KB?
由于整个输入被当作一个大整数处理,计算量会随长度的平方增长。Base58 适合密钥、哈希和地址,而不是文件。处理大量数据请使用 Base64 或 Base85。