使用方法
- 選擇「編碼」把文字或位元組轉換為 Base85,或選擇「解碼」把 Base85 還原為資料。
- 輸入或貼上內容,也可以開啟檔案。處理原始位元組時請把輸入切換為「十六進位」。
- 結果會隨輸入即時更新。解碼時根據資料內容選擇文字或十六進位輸出。
- 複製結果,或將結果下載為檔案。
什麼是 Base85?
Base85 是一類把每 4 個位元組轉換為 5 個字元的編碼。5 位 85 進位數可以表示 4,437,053,125 個值,剛好能容納任意 32 位整數,因此編碼後只增大 25%,而 Base64 要增大 33%。
Base85 有多種互不相容的字母表:Ascii85(Adobe、PDF)、Z85(ZeroMQ),以及本頁使用的這一種。它由 0-9、A-Z、a-z 和 23 個符號 !#$%&()*+-;<=>?@^_`{|}~ 組成,不包含引號、逗號、句點、斜槓、冒號、反斜槓和方括號。
RFC 1924、Git 和 Python
這套字元集出自 RFC 1924《A Compact Representation of IPv6 Addresses》。它釋出於 1996 年 4 月 1 日,是一篇愚人節 RFC,提議把 128 位 IPv6 地址寫成一個固定 20 位的 85 進位數。實際上沒有人這樣書寫 IPv6 地址,但這套字母表後來被用於通用的二進位資料:
- Git 在補丁中儲存二進位檔案時(
git diff --binary、git format-patch),會先用 zlib 壓縮資料,再用這套字母表編碼,並在每行開頭加一個長度字元。 - Python 3.4 及以上版本提供
base64.b85encode()和b85decode(),輸出與本工具一致。 - Mercurial 在 Git 格式的差異中也用同樣的編碼表示二進位檔案。
需要注意的是,RFC 1924 把整個 128 位地址一次性轉換,而 Git、Python 和本工具按 4 位元組分組處理,所以同一個 16 位元組的值,結果與 RFC 的方法不同。
末尾不足 4 位元組的處理
當輸入長度不是 4 的整數倍時,最後一組會用零位元組補齊後再編碼,只保留前 n + 1 個字元:1 個位元組變成 2 個字元,2 個位元組變成 3 個,3 個位元組變成 4 個。解碼時會反向處理,因此不需要填充字元。與 Ascii85 的 z 不同,這種變體沒有零位元組的縮寫。
# Python 3.4+
import base64
base64.b85encode(b'hello') # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv') # b'hello'
編碼規格
| 字母表 | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ |
|---|---|
| 輸出體積 | 每 4 位元組輸出 5 個字元(125%) |
| 填充 | 無 |
| 標準 | RFC 1924 字元集(Git、Python b85) |
| 區分大小寫 | 是 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | NM&qnZ!92JZ*pv8Ap |
Base64.is | LSb`dHZ(42a{ |
你好 | <h`KfrM& |
常見問題
Base85 和 Ascii85 一樣嗎?
z,並可能帶有 Adobe 定界符。處理 PDF 和 PostScript 資料請使用 Ascii85 頁面。RFC 1924 是正式標準嗎?
不是。它是一篇作為愚人節玩笑釋出的資訊類 RFC,從未真正用於 IPv6 地址。它的字元集是後來通過 Git 和 Python 流行起來的。
Base85 編碼後體積會增加多少?
Base85 可以放進 JSON 或 XML 嗎?
<、>、& 需要轉義。Base85 也不能直接用於 URL。