Mã hóa

Gzip/Deflate ↔ Base64

Nén văn bản thành Gzip hoặc Deflate rồi mã hóa kết quả bằng Base64 — và ngược lại. Hoạt động qua Compression Streams API ngay trong trình duyệt.

Base64 by itself doesn't compress anything — quite the opposite, it grows the size by about 33%. To send large text compactly through a text-only channel, it's first compressed with Gzip or Deflate, and only then is the result Base64-encoded.

How to use it

Common uses

Things to keep in mind

Compression only pays off on sufficiently large, compressible text — on short strings the Gzip header overhead plus the Base64 expansion can actually make the result bigger.

Deflate skips Gzip's headers, so its output is more compact, but the format is less self-describing: the receiving side needs to know in advance that it's Deflate specifically.

Bài viết về công cụ này: Gzip + Base64: nén dữ liệu để truyền dưới dạng văn bản

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

Sự khác biệt giữa Gzip và Deflate ở đây là gì?

Gzip bọc dữ liệu nén trong một header và checksum CRC ở cuối, còn Deflate là luồng nén thô không có phần bọc đó. Dữ liệu nén bằng định dạng này không thể giải mã bằng định dạng kia — hãy đảm bảo định dạng đã chọn khớp với cách dữ liệu được tạo ra.

Vì sao tôi cần mã hóa Base64 dữ liệu đã nén?

Đầu ra của Gzip/Deflate là nhị phân thô, vốn không phù hợp với các ngữ cảnh văn bản như URL, JSON hay tệp cấu hình. Mã hóa Base64 biến dữ liệu nhị phân đó thành văn bản ASCII an toàn, dễ sao chép.

Vì sao công cụ báo trình duyệt của tôi không hỗ trợ điều này?

Công cụ này dựa vào Compression Streams API gốc của trình duyệt (CompressionStream/DecompressionStream), vốn không có sẵn trên mọi trình duyệt hoặc phiên bản cũ — không dữ liệu nào được gửi lên máy chủ, nhưng nếu không được hỗ trợ thì công cụ đơn giản là không chạy được.

Vì sao giải nén đôi khi báo lỗi "invalid header"?

Nguyên nhân phổ biến nhất là nhầm định dạng: dữ liệu được nén dưới dạng Deflate "thô" không có header, nhưng lại được giải nén như Gzip (vốn cần header riêng và CRC-32), hoặc ngược lại. Hãy thử đổi định dạng trong cài đặt của công cụ.

Nén dữ liệu có phải lúc nào cũng giảm kích thước cuối cùng không?

Không. Với chuỗi rất ngắn, chi phí phụ trội của header Gzip cùng mức tăng do Base64 có thể vượt quá lợi ích từ nén — cách tiếp cận này chỉ hợp lý với dữ liệu văn bản đủ lớn và có khả năng nén tốt.

Bài viết: Mã hóa

Base64: mã hóa để làm gì và hoạt động ra sao

Base64 biến dữ liệu nhị phân thành văn bản ASCII như thế nào và khi nào thực sự cần đến nó.

Base32: khác gì với Base64 và khi nào tiện hơn

Bảng chữ cái Base32 không phân biệt hoa thường và các trường hợp nó tiện hơn Base64.

URL Encode/Decode: percent-encoding trong liên kết

Các ký tự đặc biệt trong địa chỉ và tham số trở thành chuỗi %XX như thế nào.

HTML Entities: cách hiển thị ký tự đặc biệt an toàn

Vì sao các ký tự < > & cần được escape và điều đó giúp tránh hỏng mã HTML thế nào.

JWT: cấu trúc token và "giải mã" JWT nghĩa là gì

Header, payload và signature của JWT, và vì sao giải mã không giống với xác minh chữ ký.

Unicode Escape: chuỗi \uXXXX nghĩa là gì

Chuỗi kiểu \u0041 trong JSON và chuỗi JS đến từ đâu và chúng nghĩa là gì.

ROT13 và mật mã Caesar: thay thế ký tự đơn giản

Vì sao dịch 13 chữ cái khiến ROT13 tự nghịch đảo, và vì sao ngày nay người ta vẫn dùng nó.

Punycode: tên miền quốc tế hóa hoạt động thế nào trong DNS

Một tên miền chứa ký tự không phải Latinh trở thành dạng ASCII với tiền tố xn-- như thế nào.

Mã Morse: văn bản biến thành chấm và gạch ra sao

Nguyên lý mã hóa chữ cái thành chấm và gạch, và mã Morse còn được dùng ở đâu hiện nay.

Data URI: khi nào nên nhúng hình ảnh trực tiếp vào mã

Một Data URI nhúng nội dung tệp trực tiếp vào HTML hoặc CSS ra sao, và khi nào đáng làm vậy.

XML Entities: escape ký tự trong tài liệu XML

Năm entity XML bắt buộc, thiếu chúng tài liệu sẽ hỏng khi phân tích cú pháp.