Cách sử dụng
- Chọn Mã hóa để chuyển văn bản hoặc byte sang Ascii85, hoặc Giải mã để chuyển Ascii85 trở lại thành dữ liệu.
- Bật tùy chọn Dấu phân định Adobe nếu đầu ra được đưa vào PostScript hoặc cần khớp với Python a85encode khi đặt adobe=True.
- Tùy chọn đặt Ngắt dòng để đầu ra dài được chia thành nhiều dòng.
- Nhập, dán hoặc mở một tệp, sau đó sao chép hoặc tải xuống kết quả. Khi giải mã, dấu phân định, dấu cách và ký tự xuống dòng đều được bỏ qua.
Ascii85 là gì?
Ascii85 đọc dữ liệu đầu vào theo từng nhóm 4 byte, xem mỗi nhóm là một số 32 bit và viết nó thành 5 chữ số cơ số 85. Các chữ số là 85 ký tự ASCII liên tiếp từ ! (mã 33) đến u (mã 117): mỗi ký tự đơn giản là giá trị chữ số cộng thêm 33. Đầu ra lớn hơn đầu vào 25%, so với 33% của Base64.
Định dạng này được dùng lần đầu bởi tiện ích btoa trên Unix. Adobe đưa nó vào làm kiểu mã hóa ASCII cơ số 85 của PostScript Level 2 và PDF, nhờ đó dữ liệu nhị phân như hình ảnh và phông chữ có thể nằm bên trong một tệp văn bản thuần. Python cung cấp nó qua base64.a85encode(), còn Go có gói encoding/ascii85.
Ký tự viết tắt z và dấu phân định Adobe
Một nhóm bốn byte 0 thông thường sẽ được viết thành năm dấu chấm than. Thay vào đó, Ascii85 viết nó thành một ký tự z duy nhất, giúp các đoạn dữ liệu rỗng liên tiếp được ngắn gọn. Cách viết tắt này chỉ áp dụng cho các nhóm đầy đủ. Khi độ dài đầu vào không phải bội số của 4, nhóm cuối gồm n byte trở thành n + 1 ký tự và không bao giờ được viết tắt.
PostScript đánh dấu một chuỗi Ascii85 bằng <~ ở đầu và ~> ở cuối. Trong một luồng (stream) PDF dùng bộ lọc ASCII85Decode, chỉ có dấu đóng ~> được dùng để đánh dấu kết thúc dữ liệu. Bộ giải mã ở đây tự loại bỏ các dấu phân định nếu có và bỏ qua khoảng trắng, nên bạn có thể dán trực tiếp dữ liệu luồng từ tệp PDF hoặc PostScript.
Ascii85 trong mã nguồn
# 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)
Đặc tả
| Bảng ký tự | ASCII 33 (!) đến 117 (u), cộng thêm z |
|---|---|
| Kích thước đầu ra | 5 ký tự cho mỗi 4 byte (125%) |
| Phần đệm | Không có, tùy chọn dấu phân định <~ ~> |
| Tiêu chuẩn | Adobe PostScript và PDF |
| Phân biệt hoa thường | Có |
Ví dụ
| Đầu vào (UTF-8) | Đầu ra |
|---|---|
Hello, World! | 87cURD_*#4DfTZ)+T |
Base64.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
Câu hỏi thường gặp
Ascii85 và Base85 khác nhau thế nào?
Vì sao đầu ra của tôi có chữ z?
z đại diện cho bốn byte 0 trong một nhóm đầy đủ. Bộ giải mã tự động khai triển nó trở lại, nên dữ liệu không bị thay đổi.Tôi có cần dấu phân định Adobe không?
Chỉ khi chương trình đọc dữ liệu yêu cầu chúng, chẳng hạn trình thông dịch PostScript hoặc Python a85decode với adobe=True. Nhiều công cụ chấp nhận Ascii85 không có dấu phân định. Khi giải mã tại đây, dấu phân định là tùy chọn.
Tôi có thể giải mã một luồng ASCII85 từ tệp PDF không?
Có. Dán dữ liệu luồng vào, chọn đầu ra Hex hoặc tải xuống kết quả. Nếu danh sách bộ lọc của luồng có FlateDecode sau ASCII85Decode, các byte giải mã vẫn đang ở dạng nén zlib và cần thêm một bước giải nén nữa.
Vì sao tôi gặp lỗi ký tự không hợp lệ?
! đến u, cộng thêm z giữa các nhóm. Cách viết tắt y cho bốn dấu cách, được một số phiên bản btoa và Python dùng khi đặt foldspaces=True, không thuộc định dạng Adobe nên sẽ bị từ chối.