Base45 編碼解碼

將文字、十六進位位元組或檔案轉換為 Base45,也可以反向解碼。Base45 只使用二維碼字母數字模式支援的 45 個字元,能以很小的開銷把二進位資料放進二維碼。

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

使用方法

  1. 選擇「編碼」把文字轉換為 Base45,或選擇「解碼」把 Base45 還原為文字或位元組。
  2. 輸入或貼上內容,也可以開啟檔案。請保留空格,它是字母表的一部分。
  3. 解碼證書載荷等二進位資料時,把輸出切換為「十六進位」。
  4. 複製結果,或將結果下載為檔案。

什麼是 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 編碼。檢視內容的步驟如下:

  1. 刪除 HC1: 字首。這四個字元都是合法的 Base45 字元,不刪除會得到錯誤的位元組。
  2. 在這裡解碼剩餘部分,輸出選擇「十六進位」。zlib 資料通常以位元組 78 開頭。
  3. 用其他工具對位元組進行 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.isSH8LQEG%61*5P2
你好C-SEFK*.K

常見問題

為什麼 Base45 輸出裡有空格?

空格是 45 個字元之一,同樣承載資料。請不要刪除或合併 Base45 文字中的空格,否則解碼會失敗或得到錯誤的位元組。

如何解碼以 HC1: 開頭的字串?

先刪除 HC1: 字首,把剩餘部分以「十六進位」輸出解碼,再用其他工具進行 zlib 解壓並讀取 CBOR 資料。本工具只完成 Base45 這一步。

Base45 區分大小寫嗎?

區分。字母表只包含大寫字母,因為二維碼的字母數字模式沒有小寫。輸入小寫字母會被報告為無效字元,並標出位置。

Base45 比 Base64 更緊湊嗎?

作為純文字並不是:Base45 是輸入的 1.5 倍,Base64 約為 1.33 倍。但放進二維碼時 Base45 更緊湊,因為它可以使用密度更高的字母數字模式。