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 地址就是一個例子。