zlib, gzip และ zip เกี่ยวข้องอย่างไร พวกเขามีอะไรที่เหมือนกันและแตกต่างกันอย่างไร


948

วิธีการบีบอัดที่ใช้ในการzlibเป็นหลักเช่นเดียวกับที่ในgzipและซิป อะไรคือgzipและซิป ? แตกต่างกันอย่างไรและเหมือนกันอย่างไร

คำตอบ:


2476

แบบสั้น:

.zipเป็นรูปแบบที่เก็บโดยใช้มักจะที่วิธีการบีบอัดยุบ .gzรูปแบบ gzipเป็นไฟล์เดียวยังใช้วิธีการบีบอัดยุบ มักจะถูกนำมาใช้ gzip ร่วมกับน้ำมันดินที่จะทำให้รูปแบบที่เก็บบีบอัด.tar.gz , ห้องสมุด zlibมีการบีบอัดและการบีบอัดรหัสยุบสำหรับการใช้งานโดยซิป gzip, PNG (ซึ่งใช้กระดาษห่อ zlibกับข้อมูลยุบ) และการใช้งานอื่น ๆ อีกมากมาย

แบบยาว:

รูปแบบ ZIPถูกพัฒนาขึ้นโดยฟิลแคทซ์เป็นรูปแบบเปิดที่มีสเปคเปิดที่การดำเนินงานของเขา PKZIP เป็นแชร์แวร์ เป็นรูปแบบไฟล์เก็บถาวรที่จัดเก็บไฟล์และโครงสร้างไดเรกทอรีซึ่งแต่ละไฟล์ถูกบีบอัดแยกกัน ประเภทไฟล์คือ.zipประเภทไฟล์ไฟล์รวมถึงโครงสร้างไดเรกทอรีสามารถเลือกที่จะเข้ารหัส

รูปแบบ ZIP รองรับวิธีการบีบอัดหลายวิธี:

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

วิธีที่ 1 ถึง 7 เป็นข้อมูลในอดีตและไม่ได้ใช้งาน วิธีการที่ 9 ถึง 98 เป็นการเพิ่มเติมล่าสุดและมีการใช้งานที่แตกต่างกันเล็กน้อย วิธีการเดียวที่ใช้กันอย่างแพร่หลายอย่างแท้จริงในรูปแบบ ZIP คือวิธีที่ 8, ยุบและวิธีที่มีขนาดเล็กกว่า 0 ซึ่งไม่มีการบีบอัดเลย แทบทุกคน.zipไฟล์ที่คุณจะพบในป่าจะใช้วิธีการเฉพาะ 8 และ 0 น่าจะเป็นเพียงวิธีที่ 8 (วิธีที่ 8 ยังมีวิธีการจัดเก็บข้อมูลอย่างมีประสิทธิภาพโดยไม่มีการบีบอัดและการขยายตัวค่อนข้างน้อยและวิธีที่ 0 ไม่สามารถสตรีม ในขณะที่วิธีที่ 8 สามารถ)

มาตรฐาน ISO / IEC 21320-1: 2015 มาตรฐานสำหรับบรรจุไฟล์เป็นรูปแบบซิป จำกัด เช่นใช้ในการเก็บไฟล์ Java (ขวด) สำนักงานเปิดไฟล์ XML (Microsoft Office .docx, .xlsx, .pptx) สำนักงานเอกสาร จัดรูปแบบไฟล์ (.odt, .ods, .odp) และไฟล์ EPUB (.epub) มาตรฐานนั้น จำกัด วิธีการบีบอัดไว้ที่ 0 และ 8 รวมถึงข้อ จำกัด อื่น ๆ เช่นไม่มีการเข้ารหัสหรือลายเซ็น

ประมาณปี 1990 กลุ่มInfo-ZIPเขียนการใช้งานzipและunzipสาธารณูปโภคแบบพกพาฟรีและโอเพนซอร์สรองรับการบีบอัดด้วยรูปแบบ Deflate และการคลายการบีบอัดของรูปแบบนั้นและรูปแบบก่อนหน้า นี่เป็นการขยายการใช้.zipรูปแบบอย่างมาก

ในช่วงต้นยุค 90 รูปแบบ gzipได้รับการพัฒนาเพื่อทดแทนยูทิลิตีUnixcompressซึ่งได้มาจากรหัส Deflate ในโปรแกรมอรรถประโยชน์ Info-ZIP Unix compressได้รับการออกแบบมาเพื่อบีบอัดไฟล์หรือสตรีมเดียวต่อท้าย.Zชื่อไฟล์ compressใช้อัลกอริธึมการบีบอัด LZWซึ่งในเวลานั้นอยู่ภายใต้สิทธิบัตรและการใช้งานฟรีนั้นถูกโต้แย้งโดยผู้ถือสิทธิบัตร แม้ว่าการใช้งานเฉพาะของ Deflate ได้รับการจดสิทธิบัตรโดย Phil Katz แต่รูปแบบก็ไม่ได้และดังนั้นจึงเป็นไปได้ที่จะเขียนการนำ Deflate ไปใช้ซึ่งไม่ได้ละเมิดสิทธิบัตรใด ๆ การดำเนินการดังกล่าวไม่ได้รับการท้าทายในช่วง 20 ปีที่ผ่านมา gzipยูทิลิตีUnix นั้นมีจุดประสงค์เพื่อใช้แทนที่compressและในความเป็นจริงก็สามารถที่จะขยายcompressข้อมูลที่บีบอัด (สมมติว่าคุณสามารถแยกประโยคได้) gzipผนวก a .gzเข้ากับชื่อไฟล์ gzipใช้รูปแบบข้อมูลที่บีบอัดของ Deflate ซึ่งบีบอัดได้ดีกว่า Unix เล็กน้อยcompressมีการบีบอัดข้อมูลที่รวดเร็วมากและเพิ่ม CRC-32 เป็นการตรวจสอบความสมบูรณ์ของข้อมูล รูปแบบส่วนหัวยังอนุญาตการจัดเก็บข้อมูลมากกว่าcompressรูปแบบที่อนุญาตเช่นชื่อไฟล์ดั้งเดิมและเวลาแก้ไขไฟล์

แม้ว่าจะcompressบีบอัดไฟล์เดียวเท่านั้นมันเป็นเรื่องปกติที่จะใช้tarยูทิลิตี้เพื่อสร้างไฟล์เก็บถาวรคุณลักษณะของพวกเขาและโครงสร้างไดเรกทอรีของพวกเขาเป็น.tarไฟล์เดียวและจากนั้นบีบอัดมันด้วยcompressเพื่อสร้าง.tar.Zไฟล์ ในความเป็นจริงtarยูทิลิตี้มีและยังคงมีตัวเลือกที่จะทำการบีบอัดในเวลาเดียวกันแทนที่จะต้องท่อส่งออกของที่จะtar compressทั้งหมดนี้นำไปสู่รูปแบบ gzip และtarมีตัวเลือกในการบีบอัดโดยตรงกับ.tar.gzรูปแบบ tar.gzรูปแบบการบีบอัดที่ดีกว่า.zipวิธีตั้งแต่การบีบอัดที่.tarสามารถใช้ประโยชน์จากความซ้ำซ้อนทั่วแฟ้มขนาดเล็กโดยเฉพาะอย่างยิ่งจำนวนมาก .tar.gzเป็นรูปแบบไฟล์เก็บถาวรที่ใช้กันมากที่สุดใน Unix เนื่องจากมีความสะดวกในการพกพาสูง แต่มีวิธีการบีบอัดที่มีประสิทธิภาพมากกว่าในการใช้งานเช่นกันดังนั้นคุณมักจะเห็น.tar.bz2และ.tar.xzเก็บถาวร

ซึ่งแตกต่างจาก.tar, .zipมีไดเรกทอรีกลางที่สิ้นสุดซึ่งมีรายการของเนื้อหาที่ นั่นและการบีบอัดแยกต่างหากให้การเข้าถึงแบบสุ่มไปยังแต่ละรายการใน.zipไฟล์ .tarไฟล์จะต้องมีการแตกไฟล์และสแกนตั้งแต่ต้นจนจบเพื่อสร้างไดเรกทอรีซึ่งเป็นวิธีแสดง.tarไฟล์

หลังจากการแนะนำของ gzip ในช่วงกลางทศวรรษที่ 1990 มีข้อพิพาทเรื่องสิทธิบัตรเดียวกันที่เรียกว่าเป็นคำถามเกี่ยวกับการใช้.gifรูปแบบภาพฟรีใช้กันอย่างแพร่หลายบนกระดานข่าวและเวิลด์ไวด์เว็บ (สิ่งใหม่ในเวลานั้น) ดังนั้นคนกลุ่มเล็ก ๆ ที่สร้างรูปแบบการบีบอัดภาพ PNG losslessly กับประเภทของไฟล์เพื่อแทนที่.png .gifรูปแบบนั้นยังใช้รูปแบบ Deflate สำหรับการบีบอัดซึ่งจะถูกนำไปใช้หลังจากตัวกรองในข้อมูลภาพทำให้เกิดความซ้ำซ้อนมากขึ้น เพื่อส่งเสริมการใช้งานรูปแบบ PNG อย่างแพร่หลายจึงมีการสร้างไลบรารี่โค้ดฟรีสองแห่ง libpngและ zlib. libpng จัดการคุณสมบัติทั้งหมดของรูปแบบ PNG และ zlib ได้จัดเตรียมรหัสการบีบอัดและการคลายการบีบอัดสำหรับใช้งานโดย libpng รวมถึงแอปพลิเคชันอื่น ๆ zlib ถูกดัดแปลงจากgzipรหัส

สิทธิบัตรดังกล่าวทั้งหมดได้หมดอายุแล้ว

ไลบรารี zlib สนับสนุนการบีบอัดและคลายการบีบอัดและการห่อสามรอบ ๆ กระแสการยุบ สิ่งเหล่านี้คือ: ไม่มีการตัดคำทั้งหมด ("raw" deflate), การตัด zlibซึ่งใช้ในบล็อกข้อมูลรูปแบบ PNG และการตัด gzip เพื่อจัดทำรูทีน gzip สำหรับโปรแกรมเมอร์ ข้อแตกต่างที่สำคัญระหว่างการตัด zlib และ gzip คือการตัด zlib มีขนาดกะทัดรัดมากขึ้นหกไบต์เทียบกับขั้นต่ำ 18 ไบต์สำหรับ gzip และการตรวจสอบความสมบูรณ์ Adler-32 ทำงานได้เร็วกว่า CRC-32 ที่ gzip ใช้ Raw Deflate ถูกใช้โดยโปรแกรมที่อ่านและเขียน.zipรูปแบบซึ่งเป็นรูปแบบอื่นที่ล้อมรอบข้อมูลที่บีบอัด

ขณะนี้ Zlib ใช้งานอย่างกว้างขวางสำหรับการส่งข้อมูลและการจัดเก็บ ยกตัวอย่างเช่น HTTP ที่สุดการทำธุรกรรมโดยเซิร์ฟเวอร์และเบราว์เซอร์บีบอัดและขยายข้อมูลโดยใช้ zlib เฉพาะส่วนหัว HTTP Content-Encoding: deflateหมายถึงวิธีการบีบอัดยุบห่อภายในรูปแบบข้อมูล zlib

การนำไปใช้งานที่แตกต่างกันของแฟบจะส่งผลในการบีบอัดเอาท์พุทที่แตกต่างกันสำหรับข้อมูลอินพุตเดียวกันเป็นหลักฐานโดยการดำรงอยู่ของระดับการบีบอัดที่เลือกได้ที่ช่วยให้การซื้อขายปิดประสิทธิภาพการบีบอัดสำหรับเวลา CPU zlib และ PKZIP ไม่ได้เป็นการใช้งานเพียงอย่างเดียวของการบีบอัดแบบยุบและการบีบอัด ทั้งยูทิลิตีการเก็บถาวร 7-Zipและไลบรารี่ zopfliของ Google มีความสามารถในการใช้เวลา CPU มากกว่า zlib เพื่อบีบบิตสองสามบิตสุดท้ายที่เป็นไปได้เมื่อใช้รูปแบบการยุบลดขนาดบีบอัดลงเล็กน้อยเมื่อเทียบกับสูงสุดของ zlib ระดับการบีบอัด ยูทิลิตี้ pigzเป็นการใช้งานแบบขนานของ gzip รวมถึงตัวเลือกในการใช้ zlib (ระดับการบีบอัด 1-9) หรือ zopfli (ระดับการบีบอัด 11) และลดผลกระทบด้านเวลาของการใช้ zopfli โดยแบ่งการบีบอัดไฟล์ขนาดใหญ่ผ่านโปรเซสเซอร์และแกนประมวลผลหลายตัว


113
โพสต์นี้เต็มไปด้วยประวัติและข้อมูลที่ฉันรู้สึกว่าต้องมีการเพิ่มการอ้างอิงบางกรณีผู้คนพยายามอ้างอิงโพสต์นี้เป็นแหล่งข้อมูล แม้ว่าข้อมูลนี้จะปรากฏที่ใดที่หนึ่งด้วยการอ้างอิงเช่น Wikipedia ลิงก์ไปยังงานที่อ้างถึงที่คล้ายกันนี้จะได้รับการชื่นชม
ThorSummoner

1348
ฉันเป็นผู้อ้างอิงโดยเป็นส่วนหนึ่งของทั้งหมด โพสต์นี้สามารถอ้างถึงใน Wikipedia เป็นแหล่งต้นฉบับ
Mark Adler

524
FYI: Mark Adler เป็นวิศวกรซอฟต์แวร์ชาวอเมริกันและมีส่วนร่วมอย่างมากในการสำรวจอวกาศ เขาเป็นที่รู้จักกันดีที่สุดสำหรับงานของเขาในด้านการบีบอัดข้อมูลในฐานะผู้เขียนฟังก์ชั่นการตรวจสอบ Adler-32 และผู้เขียนร่วมของไลบรารีการบีบอัด zlib และ gzip เขามีส่วนร่วมกับ Info-ZIP และได้มีส่วนร่วมในการพัฒนารูปแบบภาพ Portable Network Graphics (PNG) Adler ยังเป็นผู้จัดการทีม Spirit Cruise สำหรับภารกิจ Mars Exploration Rover (วิกิพีเดีย)
ไอแซกแฮนสัน

99
gzip ถูกสร้างขึ้นเพื่อแทนที่การบีบอัดของ Unix zip ไม่เหนือกว่า tar + gzip บน Unix ด้วยเหตุผลหลายประการ (เมื่อคุณเห็น.tar.gzไฟล์นั่นคือสิ่งที่มันเป็น) ขั้นแรก tar + gzip บีบอัดได้ดีกว่า zip เนื่องจากการบีบอัดของไฟล์ถัดไปสามารถใช้ประวัติจากไฟล์ก่อนหน้า (บางครั้งเรียกว่าไฟล์ "solid") zip สามารถบีบอัดไฟล์ได้ทีละไฟล์เท่านั้น ประการที่สอง tar เก็บรักษาข้อมูลไดเรกทอรี Unix ทั้งหมดในขณะที่ zip ไม่ได้ออกแบบมาให้ทำเช่นนั้น (ส่วนขยายในภายหลังในรูปแบบ zip พร้อมบล็อกเสริมเฉพาะ Unix พยายามแก้ไขปัญหานี้)
Mark Adler

85
ดูเหมือนว่าคุณจะสับสนกับรูปแบบการใช้งาน 7-Zip การดำเนินงานของรูปแบบยุบจะได้รับสิ่งที่ต้องการ 2% เหลือ 10% ดีกว่าการบีบอัดของคุณยกมามากกว่า gzip กับรูปแบบยุบเดียวกันมาก (ในขณะที่สละเวลา CPU มากขึ้นที่จะทำ) รูปแบบ 7z LZMA2 ให้การบีบอัดที่ดีขึ้น 40%
Mark Adler

43

ZIPเป็นรูปแบบไฟล์ที่ใช้สำหรับจัดเก็บไฟล์และโฟลเดอร์ตามจำนวนที่ต้องการพร้อมกับการบีบอัดแบบไม่สูญเสียข้อมูล มันทำให้ไม่มีสมมติฐานที่เข้มงวดเกี่ยวกับวิธีการบีบอัดที่ใช้ แต่มักจะถูกใช้มากที่สุดกับการยุบ

Gzipเป็นทั้งอัลกอริทึมการบีบอัดที่อิงตาม DEFLATE แต่มีข้อ จำกัด น้อยกว่ากับสิทธิบัตรที่เป็นไปได้และรูปแบบไฟล์สำหรับจัดเก็บไฟล์บีบอัดไฟล์เดียว สนับสนุนการบีบอัดจำนวนข้อของไฟล์และโฟลเดอร์เมื่อรวมกับน้ำมันดิน แฟ้มผลมีการขยาย.tgzหรือ.tar.gzและเป็นที่นิยมเรียกว่าtarball

zlibเป็นห้องสมุดของฟังก์ชั่นที่ห่อหุ้ม DEFLATE ในการเกิดชาติLZ77 ที่พบบ่อยที่สุด


28

ความแตกต่างที่สำคัญที่สุดคือ gzip สามารถบีบอัดไฟล์เดียวในขณะที่ zip บีบอัดไฟล์หลายไฟล์ทีละไฟล์และเก็บเป็นไฟล์เดียวหลังจากนั้น ดังนั้น gzip มาพร้อมกับ tar ส่วนใหญ่ (มีความเป็นไปได้อื่น ๆ ) สิ่งนี้มาพร้อมกับข้อดี (dis)

หากคุณมีไฟล์เก็บถาวรขนาดใหญ่และคุณต้องการไฟล์เดียวไฟล์เดียวคุณจะต้องแตกไฟล์ gzip ทั้งหมดเพื่อไปยังไฟล์นั้น ไม่จำเป็นถ้าคุณมีไฟล์ซิป

ในทางตรงกันข้ามถ้าคุณบีบอัดไฟล์ที่คล้ายกัน 10 ไฟล์หรือแม้แต่ไฟล์ที่เหมือนกันไฟล์ zip จะใหญ่กว่าเพราะแต่ละไฟล์ถูกบีบอัดทีละไฟล์ในขณะที่ gzip เมื่อใช้ร่วมกับ tar ไฟล์เดียวจะถูกบีบอัดซึ่งจะมีประสิทธิภาพมากกว่า คล้ายกัน (เท่ากัน)


8
คุณพูดเกินจริงประเด็น หากคนต้องการเก็บถาวรบีบอัดเข้าถึงแบบสุ่มพวกเขาสามารถสร้างไฟล์ ".gz.tar" แทนไฟล์ ".tar.gz" พวกเขาทำไม่ได้เพราะคนส่วนใหญ่ไม่สนใจการเข้าถึงแบบสุ่ม มีชุมชนขนาดใหญ่รอบ ๆ . warc.gz รูปแบบการเก็บถาวรเว็บและพวกเขาต้องการการเข้าถึงแบบสุ่มดังนั้นพวกเขาจึงบีบอัดแต่ละหน้าเว็บแยกจากกัน คุณใช้รูปแบบนี้ทุกครั้งที่คุณดูเว็บเพจใน Internet Way Wayback Machine
Greg Lindahl

2
".gz.tar" ไม่เสนอการเข้าถึงแบบสุ่มเนื่องจากรูปแบบ tar ไม่สามารถเข้าถึงรายการแบบสุ่ม คุณต้องผ่านรายการทั้งหมดตั้งแต่ต้นเพื่อให้ได้รายการเดียวที่ต้องการยิ่งแย่กว่านั้น: คุณต้องผ่านรายการทั้งหมดจนจบเพราะไฟล์เดียวกันอาจถูกเก็บถาวรหลายครั้ง (หลายรุ่น) ในหลาย ๆ ที่ ในที่เก็บถาวรเดียวกัน - และไม่มีวิธีที่จะคิดออกยกเว้นการอ่านรายการเก็บถาวรทั้งหมดโดยรายการ
Min-Soo Pipefeet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.