Bitcoin Base58 是一個由 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz 組成的 58 字元字母表,省略了視覺上容易混淆的 0、O、I 與 l,解碼後會還原為原始的位元組序列——沒有校驗碼、沒有填補字元、沒有任何祕密。這個字母表分為九個數字(1 到 9)、二十四個大寫字母(A 到 Z,不含 I 與 O),以及二十五個小寫字母(a 到 z,不含 l),共計剛好 58 個符號,作為 base-58 算術中的位置數字使用。若要解碼一段 Base58 字串,需為每個前導「1」符號計入一個前導 0x00 位元組,將其餘字元視為 base-58 位數,將該數值轉換為 base 256,再以 big-endian 位元組讀取結果。十六進位是無失真的檢視方式,因為並非每個位元組序列都能解碼為有效的 UTF-8。透過 Base58 Encode / Decode 工具在本地端執行此轉換即可強制落實這項規則:任何包含空白、標點符號或位於 Bitcoin 字母表之外字元的輸入都會被拒絕,而非被靜悄悄地清理掉,因此乾淨地複製貼上是驗證未知字串最快的方式。

Bitcoin Base58 字母表一覽
Bitcoin Base58 字母表是一串固定的 58 字元字串,了解被排除的字元在 ASCII 中的位置,能讓你更容易察錯,也能辨識出所謂的「Base58」字串實際上其實是別種東西。下表將字母表拆解為三個區段。
| Section | Characters | Count | Excludes |
|---|---|---|---|
| Digits | 123456789 | 9 | 0 |
| Uppercase | ABCDEFGHJKLMNPQRSTUVWXYZ | 24 | I and O |
| Lowercase | abcdefghijkmnopqrstuvwxyz | 25 | l |
字母大小寫具有區別意義:z(索引 57,值 57)與 Z(索引 32,值 32)是不同的位數,任何會先將輸入轉為小寫的解碼器都會產生錯誤的位元組。四個被排除的字元各自都有一個視覺上相似的搭檔——0/O 與 I/l——這正是它們被剔除的原因。尾端的空白、換行,以及任何不在此字母表內的標點符號,都會讓原始解碼器拒絕輸入,而不是自行猜測。
在需要確認某個工具使用的是正典順序,而非像 Flickr 的 Base58 這類近似變體時,請將此字母表與官方的 Bitcoin Core base58 測試向量 以及獨立的 libbase58 參考實作 相互比對。
如何使用工具解碼 Base58 字串
最快速的解碼方式是使用瀏覽器內的解碼器,它會替你處理字母表驗證、進位轉換與十六進位輸出。請依照下列步驟進行一次完整的往返轉換。
- 開啟 Base58 Encode / Decode 工具,並選擇 Base58 to bytes and text 模式。
- 將原始的 Base58 字串原樣貼上,不要加上前後空白、結尾換行,也不要夾帶複製貼上時附帶的標點符號。
- 執行解碼器。頁面會拒絕任何不在 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz 內的字元。
- 查看 hex bytes 輸出。這是權威的無失真結果,一律以小寫十六進位顯示。
- 若位元組構成有效的 UTF-8,text interpretation 面板會以可讀字元顯示同一份內容;若位元組不是有效的 UTF-8,文字面板會隱藏,僅保留十六進位檢視——這是正確結果,並非錯誤。
- 將十六進位位元組與你預期的格式(地址、WIF、雜湊值、不透明金鑰)比對。若來源將該值標示為 Base58Check、地址或含版本號的金鑰,請記得本工具僅驗證原始位元組轉換,並不會檢查其外層通訊協定。
若想取得包含範例字串與一鍵結果的逐步導覽,請參閱 Decode Base58 Strings Back to Readable Data in One Click。
前導零規則
Bitcoin Base58 的設計目的是將二進位資料——包括以一個或多個 0x00 位元組開頭的承載資料——編碼為可列印的字串。天真的整數轉換會將這些前導零捨棄,進而產生不同(且不正確)的位元組序列。Bitcoin 字母表以單一規則保留它們:每個前導 0x00 位元組會在輸出中成為前導的 1 符號,輸入中的每個前導 1 在解碼時也會還原為 0x00 位元組。
使用 Bitcoin Core 向量的實作範例:
- 單一位元組 [0x00] 編碼為「1」:一個前導 1,且沒有有效位數。
- 兩個位元組 [0x00, 0x01] 編碼為「12」:一個前導 1 代表零位元組,接著將值 1 以 base 58 表示為索引 1 的位數 2。
- 兩個位元組 [0xFF, 0xFF] 編碼為「LUv」:沒有前導 1,因為沒有前導的零位元組。
解碼「12」時,解碼器會先計算一個前導 1 並輸出一個 0x00 位元組,接著將剩餘的位數 2(值 1)轉換為位元組 0x01。位元組序列 00 01 便得以完整還原。正是這條規則,讓 Bitcoin 地址或 WIF 金鑰在經歷複製貼上、字型替換與 OCR 之後,仍能保留其前導版本位元組而不遺失。
若你貼上一串帶有多個前導 1 的字串,解碼器卻回傳一段較短的十六進位結果,那就是前導零規則正常運作,並非錯誤。
十六進位輸出與 UTF-8 文字
Base58 本質上是一種二進位編碼。即使進位轉換正確,還原出來的位元組未必恰好構成有效的 UTF-8——這一點沒有任何保證。解碼器會刻意區分這兩種情況,以確保結果隨時都可驗證。
當位元組構成有效的 UTF-8 時,兩個面板會同時顯示,且內容逐位元組一致:十六進位檢視是同一組字元的無失真編碼,與文字面板顯示的內容完全相同。當位元組不是有效的 UTF-8 時,文字面板會隱藏,並清楚標示文字詮釋不可用,僅保留十六進位檢視。這樣的分離是有意為之。若在位元組不是有效 UTF-8 時插入 Unicode 取代字元(U+FFFD),會讓文字面板看似順利完成往返轉換,實際上卻默默竄改了資料。
預期為有效 UTF-8 的字串包括簡短的英文片語、JSON 與多數通訊協定封包。預期為二進位的字串則包括原始公鑰、簽章位元組、加密後的密文,以及多數雜湊摘要。無論何種情況,都應以十六進位為準。
Base58 vs Base58Check vs Base64
Base58 是在處理 Bitcoin、IPFS 或其他識別碼格式時會遇到的常見編碼之一。選擇正確的解碼器,取決於你的輸入實際使用的是哪一種。
| Property | Base58 (Bitcoin) | Base58Check | Base64 (RFC 4648) |
|---|---|---|---|
| Symbol set | 58 alphanumerics, no 0/O/I/l | Same 58 + a leading version byte | A–Z, a–z, 0–9, +, / |
| Padding | None | None | = characters |
| Checksum | None | 4-byte double-SHA-256 appended | None |
| Case-sensitive | Yes | Yes | Yes |
| Encodes raw bytes | Yes | Yes (with checksum) | Yes |
| Validated by this tool | Yes (raw) | No — use a wallet or reviewed library | No — use a Base64 decoder |
Base58Check 才是 Bitcoin 地址、WIF 私鑰與延伸公/私鑰在傳輸時實際使用的格式:一個位元組的版本前綴、承載資料,再加上四位元組的校驗碼。此處的原始解碼器雖然能從 Base58Check 字串中取出位元組,但並不會告訴你校驗碼是否相符,或版本位元組是否對應到真實的網路。若需要進行這些檢查,請將該值送進具備格式感知能力的工具——原始解碼只是第一步。
若你需要非 Bitcoin 的字母表或帶有填補字元風格的輸出,請改用 Base64 Encode / Decode 處理二進位對文字的轉換,或使用 Base32 Encode / Decode 處理 RFC 4648 正典變體。
常見的解碼陷阱
大多數解碼失敗來自以下四種來源之一,而原始解碼器會將這些情況明確地回報為拒絕,而不是給出錯誤的答案。
- 多餘的空白或換行。許多錢包、區塊瀏覽器與 API 在回傳 Base58 字串時,會因 JSON 格式而附帶尾端的 \n。貼上前請先將其移除。
- 引號或複製貼上造成的殘留字元。來自「…」的包覆字元、智慧引號或角括號都會被拒絕,因為它們不在字母表內。
- 視覺相似的替代字元。輸入中若出現 0(零)、O(大寫 o)、I(大寫 i)或 l(小寫 L),幾乎可以確定是打錯字,因為真正的字母表裡不會包含這些字元。請與來源比對。
- 將 Base58Check 當作原始 Base58 處理。若將 Bitcoin 地址或 WIF 金鑰以原始 Base58 解碼,得到的位元組看似合理,但在驗證校驗碼時會失敗。在信任 Base58Check 值之前,請務必先透過具備校驗碼驗證能力的工具檢查。
若你懷疑輸入其實是 Base64 而非 Base58——例如因為內容包含 + 或 /,或結尾帶有一個或兩個 = 字元——請改用 Base64 解碼器。兩種字母表在字母與數字上大面積重疊,但符號與填補規則並不同,這兩種字母表無法互相替代。
若你在多方評估,Base64 Decode Example: From 'Hello' to an Emoji 對此有詳細說明。