Z85 編碼解碼

將文字、十六進位位元組或檔案轉換為 Z85,也可以反向解碼。Z85 是 ZeroMQ 定義的 Base85 變體,其字母表可以直接放進原始碼的字串字面量中,無需轉義。

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

使用方法

  1. 選擇「編碼」把文字或位元組轉換為 Z85,或選擇「解碼」把 Z85 還原為資料。
  2. 處理金鑰等二進位資料時,編碼請把輸入設為「十六進位」,解碼請把輸出設為「十六進位」。
  3. 輸入、貼上或開啟檔案,結果會隨輸入即時更新。
  4. 複製結果,或將結果下載為檔案。

什麼是 Z85?

Z85 由 ZeroMQ RFC 32 定義(這是 ZeroMQ 社群的規範,不是 IETF 的 RFC)。與其他 Base85 編碼一樣,它把每 4 個位元組轉換為 5 個字元:將每組位元組按大端序讀成一個 32 位整數,再從高位到低位寫成 5 位 85 進位數。編碼後體積增加 25%。

Z85 的特別之處在於字母表:0-9、a-z、A-Z 加上 23 個符號 .-:+=^!/*?&<>()[]{}@%$#。它沒有使用單引號、雙引號、反斜槓、反引號、逗號、分號、豎線、波浪號和下劃線,這套字母表專為在原始碼字串中安全使用而設計,因此 Z85 編碼結果可以直接放在 C、Python 或 JSON 的引號中,而不需要任何轉義。

Z85 的使用場景

ZeroMQ 用 Z85 來表示 CurveZMQ 金鑰。32 位元組的公鑰或私鑰會編碼成 40 個字元的 Z85 字串,zmq_curve_keypair() 返回的就是這種形式,CURVE 安全機制的套接字選項也接受它。libzmq 還提供 zmq_z85_encode() 和 zmq_z85_decode(),pyzmq 等語言繫結中也有相同的函式。

// C(libzmq)
char text[41];                       // 32 位元組 -> 40 個字元 + NUL
zmq_z85_encode(text, key, 32);

# Python(pyzmq)
from zmq.utils import z85
z85.encode(bytes.fromhex('864fd26fb559f75b'))   # b'HelloWorld'

最後一行是規範中給出的測試向量。

關於輸入長度的說明

RFC 32 要求二進位輸入的長度必須是 4 位元組的整數倍,編碼後的字串長度必須是 5 的整數倍。規範沒有定義填充,zmq_z85_encode() 等嚴格實現會拒絕其他長度。

本工具也接受其他長度,採用與 Ascii85 和 Base85 相同的規則:最後不足 4 位元組的 n 個位元組編碼為 n + 1 個字元。這是非標準的擴充套件,這樣得到的結果可能會被其他 Z85 解碼器拒絕。如果需要相容,請先把資料補齊到 4 位元組的整數倍。CurveZMQ 金鑰為 32 位元組,本身就符合要求。

編碼規格

字母表0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
輸出體積每 4 位元組輸出 5 個字元(125%)
填充無
標準ZeroMQ RFC 32
區分大小寫是

編碼範例

輸入 (UTF-8)輸出
Hello, World!nm=QNz.92jz/PV8aP
Base64.islsB}Dhz^42A@
你好<H}kFRm=

常見問題

Z85 和 Ascii85 有什麼區別?
兩者的計算方法相同,字母表不同。Ascii85 使用從 ! 到 u 的 ASCII 字元,其中包含引號和反斜槓,並有表示零位元組的 z 縮寫;Z85 避開了在字串中需要轉義的字元,也沒有縮寫。
Z85 有填充嗎?

沒有。規範只允許長度為 4 位元組整數倍的輸入。本工具對其他長度會用較短的最後一組進行編碼,這不屬於標準內容。

Z85 可以用在 JSON、XML 或 URL 中嗎?
放進 JSON 字串無需轉義。在 XML 和 HTML 中,<、>、& 需要轉義。Z85 不適合放進 URL,因為 ?、&、/、# 在 URL 中有特殊含義,這種場景請使用 Base64URL 或 Base58。
Z85 編碼的 CurveZMQ 金鑰有多長?

CurveZMQ 金鑰為 32 位元組,編碼後正好是 40 個字元。如需檢視原始金鑰,可以在這裡解碼並選擇十六進位輸出。