Base58 转十六进制

粘贴比特币地址、Solana 公钥或 IPFS 哈希等 Base58 字符串,即可得到十六进制形式的原始字节。开头的每个 1 都会还原为一个 00 字节。

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

使用方法

  1. 把 Base58 字符串粘贴到输入框中,空格和换行会被自动忽略。
  2. 在输出中查看十六进制形式的解码字节。
  3. 复制十六进制结果,或点击“交换”把十六进制转回 Base58。

Base58 如何转换成十六进制

Base58 把整个字符串看作一个用比特币字母表写成的大数。这套字母表共 58 个字符,去掉了 0、O、I 和 l。转换成十六进制,就是把同一个数改用 16 进制写出,每个字节对应两位十六进制数字,不会多出或丢失任何内容。

数据开头的零字节在数值上等于零,所以 Base58 把每个零字节记作一个前导 1,也就是字母表的第一个字符。解码时,每个前导 1 都会还原为一个 00 字节。例如 115Q 解码为 0000ff;Solana 的 System Program 地址由 32 个 1 组成,解码后正好是 32 个零字节。转换在浏览器本地完成。

比特币、Solana 和 IPFS 示例

下方十六进制中的空格是为了区分各部分而添加的:

比特币地址(P2PKH,创世区块)
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
00 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 c29b7d93
版本 | hash160(20 字节)| 校验和(4 字节)

Solana 公钥(SPL Token 程序)
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9
32 字节,没有版本字节,也没有校验和

IPFS CIDv0
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG
12 20 9d6c2be50f706953479ab9df2ce3edca90b68053c00b3004b7f0accbe1e8eedf
sha2-256 | 长度 32 | 摘要

传统比特币地址以 1 开头,是因为版本字节为 00;P2SH 地址以 3 开头,解码后的版本字节是 05。

Base58Check 校验和会保留在字节中

比特币地址和 WIF 私钥使用 Base58Check:编码前,会在数据末尾追加 4 个校验字节,取自对数据做两次 SHA-256 的结果。本页使用普通 Base58,校验和会像其他数据一样被解码出来,显示为最后 8 位十六进制数字。因此,传统地址的 hash160 就是开头 00 与校验和之间的 40 位十六进制数字。

如果要确认地址完整无误,并得到去掉校验和的数据,请在 Base58Check 页面解码。Solana 密钥和 IPFS 哈希不带校验和,用普通 Base58 解码即可。

在代码中把 Base58 转成十六进制

# Python (pip install base58)
import base58
base58.b58decode('115Q').hex()      # '0000ff'

// JavaScript (npm install bs58)
import bs58 from 'bs58';
Buffer.from(bs58.decode('115Q')).toString('hex');   // '0000ff'

常见问题

为什么比特币地址解码后是 25 个字节,而不是 20 个?

传统地址包含 1 字节版本号、20 字节的公钥 hash160 和 4 字节校验和。普通 Base58 解码会把三部分全部输出,所以得到 50 位十六进制数字。去掉第一个字节和最后四个字节,剩下的就是 hash160。

为什么开头的每个 1 都变成了 00?

在 Base58 中,字符 1 表示数值零。如果把数据当作普通数字处理,开头的零字节就会消失,所以每个零字节都写成一个 1,解码时再还原为 00 字节。

为什么提示字符无效?
比特币字母表中没有 0、O、I 和 l,包含这些字符的字符串就不是 Base58。以 bc1 开头的比特币地址使用的是 Bech32,属于另一种编码。瑞波币(XRP)地址使用自己的 Base58 字母表,请到 Base58 页面选择 Ripple 字母表后再解码。
Solana 公钥有多长?

正好 32 个字节,也就是 64 位十六进制数字。写成 Base58 通常是 43 或 44 个字符;以零字节开头的密钥可能更短,System Program 地址就是一个例子。