Công cụ mã hóa và giải mã Base85

Chuyển văn bản, byte hex hoặc tệp sang Base85 và ngược lại. Trang này dùng bộ ký tự RFC 1924, biến thể do Python b85encode tạo ra và được dùng trong các bản vá nhị phân của Git.

Chạy hoàn toàn trong trình duyệt của bạn. Không có gì được tải lên.

Cách sử dụng

  1. Chọn Mã hóa để chuyển văn bản hoặc byte sang Base85, hoặc Giải mã để chuyển Base85 trở lại thành dữ liệu.
  2. Nhập hoặc dán dữ liệu đầu vào, hoặc mở một tệp. Chuyển đầu vào sang Hex nếu bạn đang làm việc với byte thô.
  3. Kết quả được cập nhật ngay khi bạn gõ. Khi giải mã, hãy chọn đầu ra Văn bản hoặc Hex tùy theo nội dung của dữ liệu.
  4. Sao chép kết quả hoặc tải xuống dưới dạng tệp.

Base85 là gì?

Base85 là một họ các kiểu mã hóa biến mỗi 4 byte thành 5 ký tự. Năm chữ số cơ số 85 biểu diễn được 85 × 85 × 85 × 85 × 85 = 4.437.053.125 giá trị, vừa đủ cho mọi số 32 bit, nên đầu ra chỉ lớn hơn đầu vào 25%, so với 33% của Base64.

Có nhiều bảng ký tự Base85 khác nhau và chúng không thể dùng thay thế cho nhau: Ascii85 (Adobe, PDF), Z85 (ZeroMQ) và bảng ký tự trên trang này. Bảng này dùng 0-9, A-Z, a-z và 23 ký hiệu: !#$%&()*+-;<=>?@^_`{|}~. Các dấu nháy, dấu phẩy, dấu chấm, dấu gạch chéo, dấu hai chấm, dấu gạch chéo ngược và dấu ngoặc vuông bị loại bỏ.

RFC 1924, Git và Python

Bộ ký tự này bắt nguồn từ RFC 1924, "A Compact Representation of IPv6 Addresses" (cách biểu diễn gọn địa chỉ IPv6), được công bố ngày 1 tháng 4 năm 1996 như một trò đùa Cá tháng Tư. Tài liệu đề xuất viết địa chỉ IPv6 128 bit thành một số cơ số 85 duy nhất dài đúng 20 ký tự. Không ai viết địa chỉ IPv6 theo cách đó, nhưng bảng ký tự này về sau được dùng lại cho dữ liệu nhị phân nói chung:

  • Git lưu tệp nhị phân trong các bản vá (git diff --binary, git format-patch) dưới dạng dữ liệu nén zlib được mã hóa bằng bảng ký tự này, với một ký tự chỉ độ dài ở đầu mỗi dòng.
  • Python 3.4 trở lên cung cấp base64.b85encode() và b85decode(), với đầu ra trùng khớp với công cụ này.
  • Mercurial dùng cùng kiểu mã hóa này cho tệp nhị phân trong các bản diff theo kiểu Git.

Lưu ý rằng RFC 1924 chuyển đổi toàn bộ địa chỉ 128 bit một lần, còn Git, Python và công cụ này làm việc theo từng nhóm 4 byte, nên một giá trị 16 byte sẽ cho kết quả khác với phương pháp của RFC.

Nhóm cuối không đủ byte

Khi độ dài đầu vào không phải bội số của 4, nhóm cuối được lấp đầy bằng các byte 0, mã hóa, rồi chỉ giữ lại n + 1 ký tự đầu tiên: 1 byte thành 2 ký tự, 2 byte thành 3 và 3 byte thành 4. Bộ giải mã đảo ngược quá trình này, nên không cần ký tự đệm. Biến thể này không có cách viết tắt cho các byte 0, khác với ký tự z của Ascii85.

# Python 3.4+
import base64
base64.b85encode(b'hello')      # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv')    # b'hello'

Đặc tả

Bảng ký tự0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~
Kích thước đầu ra5 ký tự cho mỗi 4 byte (125%)
Phần đệmKhông có
Tiêu chuẩnBộ ký tự RFC 1924 (Git, Python b85)
Phân biệt hoa thườngCó

Ví dụ

Đầu vào (UTF-8)Đầu ra
Hello, World!NM&qnZ!92JZ*pv8Ap
Base64.isLSb`dHZ(42a{
你好<h`KfrM&

Câu hỏi thường gặp

Base85 có giống Ascii85 không?
Chúng dùng cùng một phép tính nhưng khác bộ ký tự, nên đầu ra khác nhau. Ascii85 còn viết tắt bốn byte 0 thành z và có thể được bao trong các dấu phân định của Adobe. Hãy dùng trang Ascii85 cho dữ liệu PDF và PostScript.
RFC 1924 có phải là một tiêu chuẩn thật không?

Không. Đây là một RFC mang tính thông tin được công bố như một trò đùa Cá tháng Tư và chưa bao giờ được dùng cho địa chỉ IPv6. Bộ ký tự của nó chỉ trở nên phổ biến sau này nhờ Git và Python.

Đầu ra Base85 lớn hơn bao nhiêu?
Mỗi 4 byte trở thành 5 ký tự, nên đầu ra lớn gấp 1,25 lần đầu vào. Base64 lớn khoảng 1,33 lần. basE91 còn gọn hơn một chút nữa.
Tôi có thể đưa Base85 vào JSON hoặc XML không?
Với JSON thì được: bảng ký tự không có dấu nháy kép hay dấu gạch chéo ngược, nên không cần thoát ký tự nào. Trong XML và HTML, các ký tự <, > và & phải được thoát. Base85 không an toàn cho URL.