Ascii85 編碼解碼

將文字、十六進位位元組或檔案轉換為 Ascii85,也可以反向解碼。Ascii85 是 PostScript 和 PDF 使用的 Base85 變體,可新增 Adobe 定界符,或把較長的輸出分行。

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

使用方法

  1. 選擇「編碼」把文字或位元組轉換為 Ascii85,或選擇「解碼」把 Ascii85 還原為資料。
  2. 如果結果要用於 PostScript,或需要與 Python a85encode 的 adobe=True 輸出一致,請開啟 Adobe 定界符。
  3. 如有需要,設定換行寬度,把較長的輸出分成多行。
  4. 輸入、貼上或開啟檔案,然後複製或下載結果。解碼時會自動忽略定界符、空格和換行。

什麼是 Ascii85?

Ascii85 每次讀取 4 個位元組,把它們當作一個 32 位整數,再寫成 5 位 85 進位數。這些「數字」是從 !(編碼 33)到 u(編碼 117)的 85 個連續 ASCII 字元,每個字元就是數值加上 33。編碼後體積增加 25%,而 Base64 要增加 33%。

這種格式最早用於 Unix 的 btoa 工具。Adobe 後來把它作為 PostScript Level 2 和 PDF 的 ASCII base-85 編碼,讓圖片、字型等二進位資料可以放在純文字檔案裡。Python 提供了 base64.a85encode(),Go 提供了 encoding/ascii85 包。

z 縮寫與 Adobe 定界符

4 個零位元組本來會編碼成 5 個感嘆號,Ascii85 則用一個 z 代替,讓連續的空資料更短。這個縮寫只用於完整的 4 位元組組。當輸入長度不是 4 的整數倍時,最後 n 個位元組會編碼為 n + 1 個字元,並且不會被縮寫。

PostScript 用 <~ 和 ~> 包圍一段 Ascii85 字串。PDF 中使用 ASCII85Decode 過濾器的資料流只用結尾的 ~> 作為資料結束標記。本工具解碼時會自動去掉這兩種定界符並忽略空白字元,因此可以直接貼上 PDF 或 PostScript 檔案中的資料流。

在程式碼中使用 Ascii85

# Python 3.4+
import base64
base64.a85encode(b'hello')                      # b'BOu!rDZ'
base64.a85encode(b'hello', adobe=True)          # b'<~BOu!rDZ~>'
base64.a85decode(b'<~BOu!rDZ~>', adobe=True)    # b'hello'

// Go
import "encoding/ascii85"
dst := make([]byte, ascii85.MaxEncodedLen(len(src)))
n := ascii85.Encode(dst, src)

編碼規格

字母表ASCII 33(!)到 117(u),另加 z
輸出體積每 4 位元組輸出 5 個字元(125%)
填充無,可選 <~ ~> 定界符
標準Adobe PostScript 與 PDF
區分大小寫是

編碼範例

輸入 (UTF-8)輸出
Hello, World!87cURD_*#4DfTZ)+T
Base64.is6=FqH2Dd%#Er
你好jLq5JV7c

常見問題

Ascii85 和 Base85 有什麼區別?
兩者都把 4 個位元組編碼為 5 個字元,但字母表不同。Ascii85 使用從 ! 到 u 的字元,並支援 z 縮寫;Base85 頁面使用 Git 和 Python b85encode 採用的 RFC 1924 字母表;Z85 則是 ZeroMQ 的變體。
為什麼輸出中有字母 z?
每個 z 代表一個完整分組中的 4 個零位元組。解碼器會自動把它還原,資料不會有任何變化。
一定要加 Adobe 定界符嗎?

只有當讀取資料的程式需要時才要加,例如 PostScript 直譯器,或開啟 adobe=True 的 Python a85decode。很多工具不帶定界符也能識別。本工具解碼時,定界符可有可無。

可以解碼 PDF 中的 ASCII85 資料流嗎?

可以。貼上資料流內容,選擇十六進位輸出或直接下載結果。如果該資料流的過濾器在 ASCII85Decode 之後還有 FlateDecode,解碼得到的位元組仍是 zlib 壓縮資料,需要再解壓一次。

為什麼提示無效字元?
Ascii85 只允許從 ! 到 u 的字元,以及出現在分組之間的 z。部分 btoa 版本和 Python foldspaces=True 使用的 y(代表 4 個空格)不屬於 Adobe 格式,會被視為無效字元。