使用方法
- 選擇「編碼」把文字或位元組轉換為 Ascii85,或選擇「解碼」把 Ascii85 還原為資料。
- 如果結果要用於 PostScript,或需要與 Python a85encode 的 adobe=True 輸出一致,請開啟 Adobe 定界符。
- 如有需要,設定換行寬度,把較長的輸出分成多行。
- 輸入、貼上或開啟檔案,然後複製或下載結果。解碼時會自動忽略定界符、空格和換行。
什麼是 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.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
常見問題
Ascii85 和 Base85 有什麼區別?
為什麼輸出中有字母 z?
z 代表一個完整分組中的 4 個零位元組。解碼器會自動把它還原,資料不會有任何變化。一定要加 Adobe 定界符嗎?
只有當讀取資料的程式需要時才要加,例如 PostScript 直譯器,或開啟 adobe=True 的 Python a85decode。很多工具不帶定界符也能識別。本工具解碼時,定界符可有可無。
可以解碼 PDF 中的 ASCII85 資料流嗎?
可以。貼上資料流內容,選擇十六進位輸出或直接下載結果。如果該資料流的過濾器在 ASCII85Decode 之後還有 FlateDecode,解碼得到的位元組仍是 zlib 壓縮資料,需要再解壓一次。
為什麼提示無效字元?
! 到 u 的字元,以及出現在分組之間的 z。部分 btoa 版本和 Python foldspaces=True 使用的 y(代表 4 個空格)不屬於 Adobe 格式,會被視為無效字元。