Base85 編碼解碼

將文字、十六進位位元組或檔案轉換為 Base85,也可以反向解碼。本頁使用 RFC 1924 字元集,與 Python b85encode 的輸出一致,也是 Git 二進位補丁所用的編碼。

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

使用方法

  1. 選擇「編碼」把文字或位元組轉換為 Base85,或選擇「解碼」把 Base85 還原為資料。
  2. 輸入或貼上內容,也可以開啟檔案。處理原始位元組時請把輸入切換為「十六進位」。
  3. 結果會隨輸入即時更新。解碼時根據資料內容選擇文字或十六進位輸出。
  4. 複製結果,或將結果下載為檔案。

什麼是 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.isLSb`dHZ(42a{
你好<h`KfrM&

常見問題

Base85 和 Ascii85 一樣嗎?
兩者的計算方法相同,但使用的字元不同,所以輸出也不同。Ascii85 還會把 4 個零位元組縮寫為 z,並可能帶有 Adobe 定界符。處理 PDF 和 PostScript 資料請使用 Ascii85 頁面。
RFC 1924 是正式標準嗎?

不是。它是一篇作為愚人節玩笑釋出的資訊類 RFC,從未真正用於 IPv6 地址。它的字元集是後來通過 Git 和 Python 流行起來的。

Base85 編碼後體積會增加多少?
每 4 個位元組變成 5 個字元,輸出約為原資料的 1.25 倍,而 Base64 約為 1.33 倍。basE91 還要更緊湊一些。
Base85 可以放進 JSON 或 XML 嗎?
放進 JSON 沒有問題,因為字母表中沒有雙引號和反斜槓,無需轉義。在 XML 和 HTML 中,<、>、& 需要轉義。Base85 也不能直接用於 URL。