Cách sử dụng
- Chọn Mã hóa để tạo một khối uuencode, hoặc Giải mã để khôi phục dữ liệu từ một khối như vậy.
- Giữ tùy chọn Dòng begin / end ở trạng thái bật và nhập Tên tệp nếu kết quả cần dùng được với lệnh uudecode. Tắt tùy chọn này nếu chỉ cần các dòng dữ liệu.
- Nhập hoặc dán dữ liệu đầu vào, hoặc mở một tệp để mã hóa các byte của nó.
- Khi giải mã, hãy dán toàn bộ khối, kể cả dòng begin nếu có, sau đó sao chép kết quả hoặc tải xuống dưới dạng tệp.
Uuencode là gì?
Uuencode, viết tắt của Unix-to-Unix encode, ra đời vào khoảng năm 1980, khi các tệp được sao chép giữa những máy Unix qua các đường liên kết UUCP vốn chỉ truyền được văn bản. Nó biến mỗi 3 byte thành bốn giá trị 6 bit và cộng thêm 32 vào mỗi giá trị, cho ra các ký tự in được từ dấu cách đến dấu gạch dưới. Vì các hệ thống thư thường cắt bỏ dấu cách ở cuối dòng, giá trị 0 được viết bằng dấu backtick (`) thay cho dấu cách, và công cụ này cũng làm như vậy.
Một tệp uuencode có bố cục cố định:
- Một dòng tiêu đề
begin 644 name, trong đó 644 là chế độ quyền của tệp Unix ở dạng bát phân (chủ sở hữu được đọc và ghi, mọi người khác chỉ được đọc) và name là tên tệp sẽ được tạo. - Các dòng dữ liệu chứa tối đa 45 byte đầu vào. Mỗi dòng bắt đầu bằng một ký tự chỉ độ dài (32 cộng số byte, nên một dòng đầy đủ bắt đầu bằng
M), theo sau là tối đa 60 ký tự đã mã hóa. - Một dòng chỉ có một dấu backtick, nghĩa là không byte nào, rồi đến dòng
end.
Tính cả các ký tự chỉ độ dài và ký tự xuống dòng, đầu ra lớn hơn đầu vào khoảng 38%.
Uuencode ngày nay
Trước khi có MIME, uuencode là cách thông dụng để gửi chương trình và hình ảnh qua email và đăng chúng lên Usenet. MIME Base64 đã thay thế nó trong thập niên 1990: uuencode không có cách khai báo kiểu nội dung, tồn tại nhiều biến thể không tương thích với nhau, và một số dấu câu của nó bị thay đổi khi đi qua các cổng nối giữa hệ thống ASCII và EBCDIC, đó là lý do xxencode ra đời.
Bạn vẫn còn gặp dữ liệu uuencode trong các kho lưu trữ thư và tin tức, các shell script cũ và những hệ thống đời cũ. Với công việc mới, hãy dùng Base64, hoặc Tệp sang Base64 cho cả tệp.
Uuencode trên dòng lệnh và trong Python
# Shell (GNU sharutils): tệp đầu vào, sau đó là tên dùng cho dòng begin
uuencode photo.jpg photo.jpg > photo.uu
uudecode photo.uu
# Python: mỗi lần một dòng, tối đa 45 byte
import binascii
line = binascii.b2a_uu(b'hello', backtick=True)
binascii.a2b_uu(line) # b'hello'
Mô-đun uu cũ của Python đã bị gỡ bỏ trong Python 3.13, nhưng các hàm của binascii vẫn còn.
Đặc tả
| Bảng ký tự | ASCII 32 đến 96 (dấu cách đến `) |
|---|---|
| Kích thước đầu ra | Khoảng 137%, tính cả ký tự đầu dòng |
| Phần đệm | Mỗi dòng tối đa 45 byte |
| Tiêu chuẩn | POSIX uuencode |
| Phân biệt hoa thường | Có |
Ví dụ
| Đầu vào (UTF-8) | Đầu ra |
|---|---|
Hello, World! | begin 644 data.bin
-2&5L;&\L(%=O<FQD(0``
`
end |
Base64.is | begin 644 data.bin
)0F%S938T+FES
`
end |
你好 | begin 644 data.bin
&Y+V@Y:6]
`
end |
Câu hỏi thường gặp
Vì sao văn bản uuencode lại chứa dấu backtick?
Giá trị 0 lẽ ra tương ứng với dấu cách, mà dấu cách ở cuối dòng thường bị mất trong quá trình truyền. Nhiều bộ mã hóa, kể cả công cụ này, viết dấu backtick thay thế. Bộ giải mã chấp nhận cả hai.
begin 644 nghĩa là gì?
Đây là dòng mở đầu khối dữ liệu đã mã hóa. 644 là chế độ quyền Unix của tệp được khôi phục (chủ sở hữu được đọc và ghi, mọi người khác chỉ được đọc), còn từ đứng sau là tên tệp mà uudecode sẽ tạo ra. Bạn có thể đặt tên này trong phần tùy chọn.
Tôi có thể giải mã uuencode khi không có dòng begin không?
Có. Nếu không có dòng begin, mọi dòng đều được giải mã như dữ liệu. Nếu có, việc giải mã bắt đầu sau dòng đó và dừng ở dòng end, nên phần văn bản xung quanh khối, chẳng hạn nội dung email, sẽ được bỏ qua. Các dấu cách ở cuối dòng bị phần mềm thư xóa mất sẽ được tự động khôi phục.
Uuencode có giống Base64 không?
Không. Cả hai đều biến 3 byte thành 4 ký tự, nhưng uuencode dùng một dải ký tự khác, có ký tự chỉ độ dài ở mỗi dòng cùng các dòng begin và end. Đầu ra Base64 không thể giải mã như uuencode và ngược lại.