Base58 编码器和解码器

步 1 / 333%

输入


            

Base58 是一种二进制到文本的编码,设计时避开了若干容易混淆的字符。Bitcoin 字母表不使用 0 O I l+ /,其他系统则会以不同顺序排列相同的 58 个符号。旧式 Bitcoin Base58Check 地址和 IPFS CIDv0 字符串是常见示例。此工具完全在浏览器中运行,可使用 Bitcoin、Ripple 或 Flickr 字母表转换 UTF-8 文本或精确的十六进制字节,并拒绝所选字母表以外的字符。

如何编码和解码 Base58

  1. 1

    输入字节或 Base58 字符串

    编码方向接受十六进制或原始文本;解码方向接受 Base58。

  2. 2

    需要时选择字母表

    默认是 Bitcoin 的 Base58;也提供 Ripple 和 Flickr 变体用于兼容。

  3. 3

    运行转换

    Base58 不会分成整齐的 5 比特或 6 比特组;它会被当作一个大端整数,并反复除以 58。

  4. 4

    复制结果

    编码后的字符串会把开头的零字节保留为开头的 `1` 字符(Bitcoin 字母表中表示零的字形)。

Bitcoin Base58 字母表

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

注意缺少的字符:0OIl。字母表中的第一个字符是 1,代表整数 0。

它实际如何工作

不同于 Base64 把比特分成固定组,Base58 会把整个字节串看作一个大端整数 N,并用 58 进制表示:

result = []
while N > 0:
    result.prepend(alphabet[N mod 58])
    N = N / 58
for each leading zero byte in input:
    result.prepend(alphabet[0])  # i.e. '1'

这就是为什么 Base58 编码不适合简单流式处理,你需要拿到整个数字后才能输出任何字符。

Base58 vs Base58Check

旧式 P2PKH 地址的典型 Base58Check 负载为 25 字节:1 字节版本、20 字节哈希和 4 字节校验和。校验和取版本与哈希进行两次 SHA-256 后的前 4 字节。将完整负载编码为 Base58,便得到常见的地址字符串。

此工具只转换普通 Base58。需要检查地址版本和校验和时,请使用专门的 Base58Check 校验器。

字母表变体

变体 使用场景 与 Bitcoin 的差异
Bitcoin BTC 地址、IPFS CIDv0 基准
Ripple XRP 地址 位置有交换
Flickr 短图片 URL 小写在大写之前

为什么不直接用 Base64?

Base64 在二进制和编码文本之间的长度变化固定(每 3 个字节变 4 个字符),效率很高。Base58 开销略有变化,但没有歧义字符;当有人必须手动复制地址或在电话里念出来时,这正是你想要的。

常见问题

不是普遍更好。人类处理字符串时 Base58 更好;机器传输时 Base64 更好。Base64 每个字符编码 6 比特,而 Base58 约为 5.86,所以 Base64 略紧凑。

Base58 编码的是一个大整数,所以长度会根据高位比特不同而差一两个字符。典型的 P2PKH 地址是 34 个字符,但 33 个也可能出现。

此工具可以把字符串解码为原始字节;请选择十六进制输出,以便无损显示任意字节。它不会检查版本或校验和,因此能够解码并不代表地址有效。验证地址需要使用 Base58Check 校验器。

可以。输入开头的每个零字节都会在输出中变成一个 1 字符,这正是以 1 开头的 Bitcoin 地址的工作方式。

相关工具