Base64 biến byte bất kỳ thành 64 ký tự in được, để dữ liệu đi lọt qua những nơi chỉ nhận văn bản: thân email, một trường JSON, file cấu hình YAML, một URL. Trang này chuyển đổi cả hai chiều, cho chuỗi dán vào lẫn cho file, mà không gửi gì đi đâu.
Cái giá của phép chuyển đổi
Base64 không nén — nó làm ngược lại. Cứ ba byte đầu vào thành bốn ký tự đầu ra, nên kết quả bằng bốn phần ba thứ bỏ vào, cộng thêm padding. Ảnh 3 MB sẽ thành khoảng 4 MB văn bản. Đó là cái giá để nhét dữ liệu nhị phân vào chỗ chỉ cho phép văn bản, và nên biết trước khi bạn nhúng một tài sản lớn vào stylesheet.
| Đầu vào | Đầu ra | Tăng |
|---|---|---|
| 3 byte | 4 ký tự | 133% |
| 1 KB | 1.368 ký tự | 133% |
| 1 MB | ~1,37 MB | 133% |
Chế độ Văn bản và chế độ File
Chế độ Văn bản chuyển đổi ngay khi gõ, dành cho việc thường ngày: một đoạn token cần đọc, một giá trị cấu hình, một chuỗi ngắn. Nó chặn ở 1 MB, và giới hạn đó nói về sức chịu của ô nhập liệu chứ không phải của bộ mã hóa.
Chế độ File lo phần còn lại. File được đọc theo dòng và chuyển từng phần, nên file lớn không làm treo tab: việc nặng chạy ngoài luồng chính, trang vẫn phản hồi trong lúc thanh tiến độ chạy. Bạn thấy trước phần đầu kết quả và có nút Tải về cho toàn bộ.
Chuẩn và URL-safe khác nhau ở đâu
Hai bảng chữ chỉ khác nhau đúng hai ký tự, ở vị trí 62 và 63:
| Vị trí | Chuẩn | URL-safe |
|---|---|---|
| 62 | dấu cộng | gạch ngang |
| 63 | gạch chéo | gạch dưới |
Mọi thứ còn lại y hệt nhau, nên một giá trị tình cờ không chứa hai ký tự đó sẽ giống nhau ở cả hai bảng. Chính điều này làm lỗi khó phát hiện: chuỗi ngắn mã ra giống nhau, chuỗi dài thì âm thầm khác. Khi giải mã, công cụ này nhận cả hai mà không cần bạn khai báo, nên token dán từ đâu vào cũng chạy.
Về padding
Dấu bằng ở cuối không phải dữ liệu. Base64 xuất bốn ký tự cho mỗi ba byte, và khi đầu vào không chia hết thì nhóm cuối bị thiếu:
f(1 byte) thànhZg==fo(2 byte) thànhZm8=foo(3 byte) thànhZm9v, không cần đệm gì
Có hệ thống bắt buộc padding, có hệ thống lại từ chối, còn JWT thì bỏ hẳn. Công tắc quyết định thứ được ghi ra; còn bộ giải mã thì kiểu nào cũng nhận.
Data URI
Bật tùy chọn data URI khi mã hóa file sẽ bọc kết quả bằng tiền tố mà trình duyệt cần để coi nó
là tài nguyên nhúng, và tự điền loại file giúp bạn. Kết quả dán thẳng vào background-image
trong CSS hay thẻ img trong HTML là chạy. Chiều ngược lại đối xứng: dán cả data URI vào thì
tiền tố được nhận ra và bỏ đi trước khi giải mã phần dữ liệu.
Nhúng kiểu này là một đánh đổi thật sự. Nó bớt được một request mạng, nên icon nhỏ hay được nhúng, nhưng nó cũng làm file chứa nó phình thêm một phần ba và không cache riêng được. Dưới vài KB thì thường lợi; trên mức đó thì thường không.
Khi giải mã thất bại
Có hai thứ hỏng được, và công cụ phân biệt rạch ròi:
- Ký tự không hợp lệ. Có gì đó trong đầu vào không thuộc bảng chữ nào cả. Vị trí được báo ra để bạn nhìn thẳng vào chỗ đó — hay gặp nhất là dấu nháy lạc, dấu ba chấm do trình soạn thảo tự đổi, hoặc một mẩu JSON bao quanh bị bôi đen theo.
- Độ dài không thể đúng. Base64 chỉ hợp lệ ở vài độ dài nhất định, và một trong các số dư là bất khả. Gần như luôn có nghĩa giá trị đã bị cắt cụt trên đường đi.