使用方法
- 選擇「編碼」把文字轉換為 Base45,或選擇「解碼」把 Base45 還原為文字或位元組。
- 輸入或貼上內容,也可以開啟檔案。請保留空格,它是字母表的一部分。
- 解碼證書載荷等二進位資料時,把輸出切換為「十六進位」。
- 複製結果,或將結果下載為檔案。
什麼是 Base45?
Base45 由 RFC 9285 定義。它的字母表包括數字 0-9、大寫字母 A-Z 以及 9 個符號:空格和 $ % * + - . / :。這正是二維碼在緊湊的字母數字模式下可以儲存的 45 個字元。請注意,空格是字母表中的正式字元,而不是分隔符。
編碼時每次取兩個位元組,把它們看作 0 到 65535 之間的數字,再寫成三位 Base45 數字,低位在前。最後剩下的單個位元組編碼為兩個字元。作為文字,結果是輸入的 1.5 倍,比 Base64 更長。
為什麼 Base45 適合二維碼
在字母數字模式下,二維碼用 11 位儲存兩個字元。Base64 需要小寫字母,無法使用這種模式,只能退回每個字元 8 位的位元組模式,平均每個資料位元組約佔 10.7 位。Base45 在字母數字模式下每個位元組只需 8.25 位,同樣的資料可以放進更小、更容易掃描的二維碼。
解碼時請原樣保留空格,只有換行會被忽略。小寫字母不屬於字母表,會被報告為無效字元。
解碼歐盟數字新冠證書
歐盟數字新冠證書(EU DCC)二維碼中的文字以 HC1: 開頭,後面是 Base45 資料:證書內容先編碼為 CBOR,用 COSE 簽名,再經 zlib 壓縮,最後進行 Base45 編碼。檢視內容的步驟如下:
- 刪除
HC1:字首。這四個字元都是合法的 Base45 字元,不刪除會得到錯誤的位元組。 - 在這裡解碼剩餘部分,輸出選擇「十六進位」。zlib 資料通常以位元組
78開頭。 - 用其他工具對位元組進行 zlib 解壓並解析 CBOR。
本工具只負責 Base45 這一步,不會解壓、解析內容或驗證簽名。
在程式碼中使用 Base45
# Python (pip install base45)
import base45
base45.b45encode(b'AB') # RFC 9285 範例:BB8
base45.b45decode('BB8') # b'AB'
編碼規格
| 字母表 | 0-9 A-Z 空格 $ % * + - . / : |
|---|---|
| 輸出體積 | 每 2 位元組輸出 3 個字元(150%) |
| 填充 | 無 |
| 標準 | RFC 9285 |
| 區分大小寫 | 是 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | %69 VDK2E:3404ESVDX0 |
Base64.is | SH8LQEG%61*5P2 |
你好 | C-SEFK*.K |
常見問題
為什麼 Base45 輸出裡有空格?
空格是 45 個字元之一,同樣承載資料。請不要刪除或合併 Base45 文字中的空格,否則解碼會失敗或得到錯誤的位元組。
如何解碼以 HC1: 開頭的字串?
先刪除 HC1: 字首,把剩餘部分以「十六進位」輸出解碼,再用其他工具進行 zlib 解壓並讀取 CBOR 資料。本工具只完成 Base45 這一步。
Base45 區分大小寫嗎?
區分。字母表只包含大寫字母,因為二維碼的字母數字模式沒有小寫。輸入小寫字母會被報告為無效字元,並標出位置。
Base45 比 Base64 更緊湊嗎?
作為純文字並不是:Base45 是輸入的 1.5 倍,Base64 約為 1.33 倍。但放進二維碼時 Base45 更緊湊,因為它可以使用密度更高的字母數字模式。