使用方法
- 選擇「編碼」把文字轉換為 Base32hex,或選擇「解碼」把 Base32hex 還原為文字。
- 保持選擇 Base32hex 變體。如果目標格式需要,可以關閉「填充」或勾選「小寫」。
- 輸入或貼上內容,也可以開啟檔案,結果會隨輸入即時更新。
- 複製結果,或將結果下載為檔案。
什麼是 Base32hex?
Base32hex 是 RFC 4648 第 7 節定義的「使用擴充套件十六進位字母表的 Base32 編碼」。它的工作方式與標準 Base32 完全相同:每個字元承載 5 位,每 5 個位元組變成 8 個字元,並用 = 填充到 8 的倍數,區別只在於字母表。Base32hex 不使用 A-Z 2-7,而是接著十六進位繼續往下數:數字 0 到 9 代表 0 到 9,A 代表 10,一直到 V 代表 31。
由於兩種字母表的字元大量重疊,把 Base32hex 字串交給標準 Base32 解碼器往往不會報錯,但得到的位元組是錯的。解碼時務必選擇與編碼時相同的變體。
保持排序
Base32hex 的字母表按 ASCII 升序排列,每個字元的值隨位置遞增,因此逐字元比較兩個 Base32hex 字串,得到的順序與比較原始位元組完全一致。RFC 4648 特別指出了這一點,這是標準 Base32 和 Base64 不具備的特性,也讓 Base32hex 適合用作資料庫、鍵值儲存等有序儲存中的鍵。
請讓所有字串保持同一種大小寫;當輸入長度不同時,最好關閉填充,因為 = 在 ASCII 中位於數字和字母之間,可能打亂順序。
DNSSEC NSEC3 中的 Base32hex
RFC 5155 定義的 NSEC3 記錄用於證明某個域名不存在,同時讓人更難列舉區域內的全部域名。每個域名都會經過 SHA-1 雜湊,20 位元組的雜湊值寫成 32 個字元的 Base32hex 標籤,不帶填充,通常顯示為小寫。由於編碼保持了雜湊值的順序,這些雜湊名可以構成一條有序鏈。若要把雜湊值轉換為這樣的標籤,可以以十六進位形式輸入雜湊,關閉「填充」並勾選「小寫」。本工具只負責編碼這一步,不會計算加鹽迭代的 NSEC3 雜湊。
在程式碼中使用 Base32hex
# Python 3.10+
import base64
base64.b32hexencode(b'foobar') # b'CPNMUOJ1E8======'
base64.b32hexdecode('CPNMUOJ1E8======') # b'foobar'
// Go (import "encoding/base32")
base32.HexEncoding.EncodeToString(data)
base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(data)
編碼規格
| 字母表 | 0-9 A-V |
|---|---|
| 輸出體積 | 每 5 位元組輸出 8 個字元(160%) |
| 填充 | 用 = 補足到 8 的倍數 |
| 標準 | RFC 4648 第 7 節 |
| 區分大小寫 | 否 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | 91IMOR3F5GG5ERRIDHI22=== |
Base64.is | 89GN6P9M6GN6ISO= |
你好 | SIUQ1PD5NK====== |
常見問題
Base32 和 Base32hex 有什麼區別?
A-Z 2-7,Base32hex 使用 0-9 A-V,因而能保持資料的排序。兩者不能混用。Base32hex 區分大小寫嗎?
字母表以大寫定義,但本工具解碼時也接受小寫輸入。如果需要小寫輸出(例如用於 DNS 標籤),勾選「小寫」即可。
需要使用填充嗎?
= 填充到 8 個字元的整數倍,但包括 NSEC3 在內的許多格式都省略填充。解碼器兩種寫法都接受,請按接收方的要求選擇。