Thuật toán nén được sử dụng trong zlib về cơ bản giống như trong thuật toán gzip và zip . Là gì gzip và zip ? Chúng khác nhau như thế nào và chúng giống nhau như thế nào?
Thuật toán nén được sử dụng trong zlib về cơ bản giống như trong thuật toán gzip và zip . Là gì gzip và zip ? Chúng khác nhau như thế nào và chúng giống nhau như thế nào?
Câu trả lời:
Hình thức ngắn:
.zip
là một định dạng lưu trữ bằng cách sử dụng, thông thường, phương pháp nén Deflate . Các .gz
định dạng gzip là cho các tập tin duy nhất, cũng sử dụng phương pháp nén Deflate. Thông thường gzip được sử dụng kết hợp với tar để tạo định dạng lưu trữ nén , .tar.gz
. Các thư viện zlib cung cấp Deflate nén và giải nén mã cho sử dụng bởi zip, gzip, png (trong đó sử dụng các wrapper zlib trên dữ liệu deflate), và nhiều ứng dụng khác.
Hình thức dài:
Các định dạng ZIP được phát triển bởi Phil Katz là một định dạng mở với một đặc điểm kỹ thuật mở, nơi thực hiện của mình, PKZIP, là phần mềm chia sẻ. Nó là một định dạng lưu trữ lưu trữ các tệp và cấu trúc thư mục của chúng, trong đó mỗi tệp được nén riêng lẻ. Loại tập tin là .zip
. Các tập tin, cũng như cấu trúc thư mục, có thể tùy chọn được mã hóa.
Định dạng ZIP hỗ trợ một số phương thức nén:
0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
9 - Enhanced Deflating using Deflate64(tm)
10 - PKWARE Data Compression Library Imploding (old IBM TERSE)
11 - Reserved by PKWARE
12 - File is compressed using BZIP2 algorithm
13 - Reserved by PKWARE
14 - LZMA (EFS)
15 - Reserved by PKWARE
16 - Reserved by PKWARE
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture (PFS)
97 - WavPack compressed data
98 - PPMd version I, Rev 1
Phương pháp 1 đến 7 là lịch sử và không được sử dụng. Phương pháp 9 đến 98 là những bổ sung tương đối gần đây và với số lượng nhỏ sử dụng khác nhau. Phương pháp duy nhất trong việc sử dụng thực sự rộng rãi ở định dạng ZIP là phương thức 8, Deflate và ở một mức độ nhỏ hơn là phương thức 0, hoàn toàn không nén. Hầu như mọi .zip
tệp mà bạn gặp phải trong tự nhiên sẽ chỉ sử dụng các phương thức 8 và 0, có thể chỉ là phương thức 8. (Phương thức 8 cũng có một phương tiện để lưu trữ dữ liệu một cách hiệu quả mà không cần nén và mở rộng tương đối, và Phương thức 0 không thể được truyền phát trong khi Phương thức 8 có thể.)
Các tiêu chuẩn ISO / IEC 21.320-1: 2015 tiêu chuẩn cho container tập tin là một định dạng zip hạn chế, chẳng hạn như sử dụng trong Java lưu trữ file (.jar), các file Office Open XML (Microsoft Office .docx, .xlsx, .pptx), Office Document Định dạng tệp (.odt, .ods, .odp) và tệp EPUB (.epub). Tiêu chuẩn đó giới hạn các phương thức nén thành 0 và 8, cũng như các ràng buộc khác như không mã hóa hoặc chữ ký.
Khoảng năm 1990, nhóm Info-ZIP đã viết các triển khai zip
và unzip
tiện ích nguồn mở, miễn phí, di động , hỗ trợ nén với định dạng Deflate và giải nén các định dạng đó và các định dạng trước đó. Điều này mở rộng đáng kể việc sử dụng .zip
định dạng.
Vào đầu những năm 90, định dạng gzip đã được phát triển để thay thế cho tiện ích Unixcompress
, xuất phát từ mã Deflate trong các tiện ích Info-ZIP. Unix compress
được thiết kế để nén một tệp hoặc luồng, gắn thêm .Z
tên tệp. compress
sử dụng thuật toán nén LZW , vào thời điểm đó là bằng sáng chế và việc sử dụng miễn phí đã bị tranh chấp bởi các chủ sở hữu bằng sáng chế. Mặc dù một số triển khai cụ thể của Deflate đã được Phil Katz cấp bằng sáng chế, nhưng định dạng này thì không, và do đó, có thể viết một triển khai Deflate không vi phạm bất kỳ bằng sáng chế nào. Việc thực hiện đó đã không bị thách thức như vậy trong hơn 20 năm qua. gzip
Tiện ích Unix được dự định là một sự thay thế thả vào chocompress
và trên thực tế có thể giải compress
nén dữ liệu được nén (giả sử rằng bạn có thể phân tích câu đó). gzip
nối thêm một .gz
tên tập tin. gzip
sử dụng định dạng dữ liệu nén Deflate, nén tốt hơn một chút so với Unix compress
, có khả năng giải nén rất nhanh và thêm CRC-32 làm kiểm tra tính toàn vẹn cho dữ liệu. Định dạng tiêu đề cũng cho phép lưu trữ nhiều thông tin hơn compress
định dạng cho phép, chẳng hạn như tên tệp gốc và thời gian sửa đổi tệp.
Mặc dù compress
chỉ nén một tệp duy nhất, nhưng thông thường sử dụng tar
tiện ích để tạo tệp lưu trữ tệp, thuộc tính và cấu trúc thư mục của chúng thành một .tar
tệp duy nhất và sau đó nén tệp đó compress
để tạo .tar.Z
tệp. Trong thực tế, tar
tiện ích đã và vẫn còn có một tùy chọn để thực hiện nén cùng lúc, thay vì phải ống đầu ra của tar
để compress
. Tất cả điều này được chuyển sang định dạng gzip và tar
có tùy chọn nén trực tiếp sang .tar.gz
định dạng. Các tar.gz
định dạng nén tốt hơn so với .zip
cách tiếp cận, kể từ khi nén của một .tar
thể tận dụng dư thừa trên các tập tin, đặc biệt là nhiều tập tin nhỏ. .tar.gz
là định dạng lưu trữ phổ biến nhất được sử dụng trên Unix do tính di động rất cao, nhưng cũng có các phương pháp nén hiệu quả hơn, vì vậy bạn sẽ thường thấy .tar.bz2
và .tar.xz
lưu trữ.
Không giống như .tar
, .zip
có một thư mục trung tâm ở cuối, cung cấp một danh sách các nội dung. Điều đó và nén riêng biệt cung cấp quyền truy cập ngẫu nhiên vào các mục riêng lẻ trong một .zip
tệp. Một .tar
tệp sẽ phải được giải nén và quét từ đầu đến cuối để xây dựng một thư mục, đó là cách một .tar
tệp được liệt kê.
Ngay sau khi giới thiệu gzip, vào khoảng giữa những năm 1990, tranh chấp bằng sáng chế tương tự đã đặt ra câu hỏi về việc sử dụng .gif
định dạng hình ảnh miễn phí , được sử dụng rất rộng rãi trên bảng tin và World Wide Web (một điều mới vào thời điểm đó). Vì vậy, một nhóm nhỏ đã tạo định dạng hình ảnh nén không mất PNG, với loại tệp .png
, để thay thế .gif
. Định dạng đó cũng sử dụng định dạng Deflate để nén, được áp dụng sau khi các bộ lọc trên dữ liệu hình ảnh lộ ra nhiều sự dư thừa. Để thúc đẩy sử dụng rộng rãi định dạng PNG, hai thư viện mã miễn phí đã được tạo. libpng và zlib. libpng đã xử lý tất cả các tính năng của định dạng PNG và zlib đã cung cấp mã nén và giải nén để libpng sử dụng, cũng như cho các ứng dụng khác. zlib đã được điều chỉnh từ gzip
mã.
Tất cả các bằng sáng chế được đề cập đã hết hạn.
Thư viện zlib hỗ trợ nén và giải nén Deflate, và ba loại gói xung quanh các luồng phát tán. Đó là: không có gói nào cả (khử "thô"), gói zlib , được sử dụng trong các khối dữ liệu định dạng PNG và gói gzip, để cung cấp các thường trình gzip cho lập trình viên. Sự khác biệt chính giữa gói zlib và gzip là gói zlib nhỏ gọn hơn, sáu byte so với tối thiểu 18 byte cho gzip và kiểm tra tính toàn vẹn, Adler-32, chạy nhanh hơn CRC-32 mà gzip sử dụng. Định dạng thô được sử dụng bởi các chương trình đọc và ghi .zip
định dạng, đây là định dạng khác bao quanh dữ liệu nén.
zlib hiện đang được sử dụng rộng rãi để truyền và lưu trữ dữ liệu. Ví dụ: hầu hết các giao dịch HTTP của máy chủ và trình duyệt đều nén và giải nén dữ liệu bằng zlib, cụ thể tiêu đề HTTP Content-Encoding: deflate
có nghĩa là phương pháp nén khử băng được bọc bên trong định dạng dữ liệu zlib .
Việc triển khai giảm phát khác nhau có thể dẫn đến đầu ra nén khác nhau cho cùng một dữ liệu đầu vào, bằng chứng là sự tồn tại của các mức nén có thể lựa chọn cho phép đánh đổi hiệu quả nén trong thời gian CPU. zlib và PKZIP không phải là triển khai duy nhất của nén và giải nén. Cả tiện ích lưu trữ 7-Zip và thư viện zopfli của Google đều có khả năng sử dụng thời gian CPU nhiều hơn zlib để vắt kiệt vài bit cuối cùng có thể khi sử dụng định dạng khử, giảm kích thước nén xuống vài phần trăm so với mức cao nhất của zlib mức nén. Các tiện ích pigz, một triển khai song song của gzip, bao gồm tùy chọn sử dụng zlib (mức nén 1-9) hoặc zopfli (mức nén 11) và phần nào giảm thiểu tác động thời gian của việc sử dụng zopfli bằng cách chia nén các tệp lớn trên nhiều bộ xử lý và lõi.
.tar.gz
các tệp, đó là những gì chúng là.) Đầu tiên, tar + gzip nén tốt hơn zip, vì việc nén tệp tiếp theo có thể sử dụng lịch sử từ tệp trước đó (đôi khi được gọi là lưu trữ "solid"). zip chỉ có thể nén các tập tin cá nhân. Thứ hai, tar bảo toàn tất cả thông tin thư mục Unix, trong khi zip không được thiết kế để làm điều đó. (Các tiện ích mở rộng sau này sang định dạng zip với các khối bổ sung dành riêng cho Unix cố gắng khắc phục sự cố này.)
ZIP là một định dạng tệp được sử dụng để lưu trữ một số lượng tệp và thư mục tùy ý cùng với nén không mất dữ liệu. Nó không đưa ra các giả định nghiêm ngặt về các phương thức nén được sử dụng, nhưng thường được sử dụng nhất với DEFLATE .
Gzip vừa là thuật toán nén dựa trên DEFLATE nhưng ít bị vướng mắc với các bằng sáng chế tiềm năng et al và định dạng tệp để lưu trữ một tệp nén. Nó hỗ trợ nén một số lượng tệp và thư mục tùy ý khi kết hợp với tar . Tệp kết quả có phần mở rộng là .tgz
hoặc .tar.gz
và thường được gọi là tarball .
zlib là một thư viện các hàm đóng gói DEFLATE trong phiên bản LZ77 phổ biến nhất của nó .
Sự khác biệt quan trọng nhất là gzip chỉ có khả năng nén một tệp trong khi zip nén nhiều tệp một và lưu trữ chúng thành một tệp duy nhất sau đó. Do đó, gzip đi kèm với tar hầu hết thời gian (mặc dù có những khả năng khác). Điều này đi kèm với một số lợi thế (dis).
Nếu bạn có một kho lưu trữ lớn và bạn chỉ cần một tệp duy nhất trong số đó, bạn phải giải nén toàn bộ tệp gzip để đến tệp đó. Điều này là không bắt buộc nếu bạn có một tệp zip.
Mặt khác, nếu bạn nén 10 tệp tương tự hoặc thậm chí giống hệt nhau, kho lưu trữ zip sẽ lớn hơn nhiều vì mỗi tệp được nén riêng lẻ, trong khi trong gzip kết hợp với tar, một tệp duy nhất được nén sẽ hiệu quả hơn nhiều nếu các tệp được tương tự (bằng nhau).