2012-04-18 39 views
5

Đã googled, wikied và đọc RFC của ZIP, nhưng không thể tìm thấy bất kỳ thông tin nào về thuật toán chính xác được sử dụng trong ZIP.Thuật toán nào đang sử dụng trong ZIP chuẩn?

Tôi đã tìm thấy thông tin về ZIP == TAR + GZIP

Nhưng, tôi bị nhầm lẫn bởi thông tin này.

Vì GZIP sử dụng thuật toán LZW như tôi nhớ và TAR sử dụng LZMA, và tôi không thể tưởng tượng như thế nào có thể là ZIP == TAR + GZIP (LZMA + LZW - ???)

Vì vậy, bạn có thể giúp đỡ được với việc tìm kiếm thuật toán của ZIP, tôi muốn thực hiện nó.

+1

ZIP có thể sử dụng bất kỳ thuật toán nào trong số đó. Có một thông số đặt trên web ở đâu đó ... –

+1

Ah, [ở đây là] (http://www.pkware.com/documents/casestudies/APPNOTE.TXT): Làm lệch, Deflate64, Implode, BZIP2, LZMA, hoặc PPMd +. –

Trả lời

7

Zip cung cấp khả năng tương đương với sự kết hợp của tar với gzip.

tar chỉ thu thập một số tệp với nhau thành một tệp duy nhất, giữ lại thông tin về các tệp gốc (ví dụ: đường dẫn, ngày tháng). Trái với tuyên bố trong câu hỏi, chính nó tự động nén không. gzip chỉ mất một tệp và nén nó.

Zip thực hiện cả hai - nghĩa là, nó lưu trữ một số tệp thành phần vào một tệp lưu trữ (một lần nữa, lưu giữ những thứ như đường dẫn, ngày tháng, v.v.) và nén chúng. Không giống như tar + gzip, nó nén từng tệp riêng lẻ và để lại thông tin "thư mục" về các tệp thành phần chưa được nén. Điều này làm cho nó dễ dàng để làm việc với các tập tin cá nhân trong kho lưu trữ (chèn, xóa, giải nén, vv) nhưng cũng có nghĩa là nó thường sẽ không nhận được tốt như nén tổng thể.

Thay vì thực hiện lại thuật toán nén của zip, bạn gần như chắc chắn nên tải xuống mã (giấy phép cực kỳ di động, rất tự do) từ zlib web site. Trang web zlib có một thuật toán khá hợp lý là explanation. Nếu bạn thực sự muốn tự mình thực hiện điều này, có thể bạn cũng muốn xem RFC 1950, 1951 và 1952.

+1

Đó cũng là những gì [Wikipedia] (http://en.wikipedia.org/wiki/Tar_ (file_format) #Naming_of_compressed_tar_files) nói. – fb55

+1

Lưu ý rằng zlib chỉ thực hiện nén/giải nén, không phải cơ chế lưu trữ. –

+1

@HotLicks: Đúng - nếu bạn muốn mã cho phần lưu trữ, đó là tại trang web [Info-zip] (http://www.info-zip.org). –

1

"zip" trong ngữ cảnh này là định dạng tệp cho phép nhiều phương pháp nén khác nhau. Chúng bao gồm deflate, deflate64, bzip2, lzma, wavpack và ppmd. Tuy nhiên, trong thực tế, bạn sẽ hầu như luôn thấy deflate được sử dụng độc quyền trong các tệp zip, để tương thích.

deflate cũng là phương pháp nén được sử dụng trong gzip và zlib, cũng như định dạng hình ảnh png.

xì hơi là máy nén LZ77 chứ không phải LZ78.

tar là một bộ lưu trữ chứ không phải máy nén. Nó tạo ra định dạng tệp .tar. Tệp .tar thường được nén (thuận tiện bởi chính chương trình tar gọi các chương trình bên ngoài), bổ sung thêm hậu tố, ví dụ: .tar.gz để nén gzip. các tùy chọn tar bao gồm -z cho gzip, -j cho bzip2 (.bz2) và -J cho lzma (.xz).

Bạn không cần triển khai thuật toán để giảm phát. Nó đã được thực hiện cho bạn. Bạn có thể sử dụng zlib trong mã của mình, trong đó có một giấy phép rất tự do.