Base32hex 編碼解碼

使用擴充套件十六進位字母表,將文字、十六進位位元組或檔案轉換為 Base32,也可以反向解碼。可以控制填充和大小寫,例如生成 NSEC3 風格的標籤。

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 選擇「編碼」把文字轉換為 Base32hex,或選擇「解碼」把 Base32hex 還原為文字。
  2. 保持選擇 Base32hex 變體。如果目標格式需要,可以關閉「填充」或勾選「小寫」。
  3. 輸入或貼上內容,也可以開啟檔案,結果會隨輸入即時更新。
  4. 複製結果,或將結果下載為檔案。

什麼是 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.is89GN6P9M6GN6ISO=
你好SIUQ1PD5NK======

常見問題

Base32 和 Base32hex 有什麼區別?
兩者都是每個字元 5 位,填充規則也相同。標準 Base32 使用 A-Z 2-7,Base32hex 使用 0-9 A-V,因而能保持資料的排序。兩者不能混用。
Base32hex 區分大小寫嗎?

字母表以大寫定義,但本工具解碼時也接受小寫輸入。如果需要小寫輸出(例如用於 DNS 標籤),勾選「小寫」即可。

需要使用填充嗎?
RFC 4648 會用 = 填充到 8 個字元的整數倍,但包括 NSEC3 在內的許多格式都省略填充。解碼器兩種寫法都接受,請按接收方的要求選擇。
Base32hex 字串就是十六進位嗎?
不是。即使某個 Base32hex 字串恰好只包含 0-9 和 A-F,看起來像十六進位,它的每個字元承載的也是 5 位而不是 4 位。處理普通十六進位請使用 Base16 工具。