Cách sử dụng
- 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.
- 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ô.
- 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.
- 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 ra | 5 ký tự cho mỗi 4 byte (125%) |
| Phần đệm | Không có |
| Tiêu chuẩn | Bộ ký tự RFC 1924 (Git, Python b85) |
| Phân biệt hoa thường | Có |
Ví dụ
| Đầu vào (UTF-8) | Đầu ra |
|---|---|
Hello, World! | NM&qnZ!92JZ*pv8Ap |
Base64.is | LSb`dHZ(42a{ |
你好 | <h`KfrM& |
Câu hỏi thường gặp
Base85 có giống Ascii85 không?
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?
Tôi có thể đưa Base85 vào JSON hoặc XML không?
<, > và & phải được thoát. Base85 không an toàn cho URL.