Auf dieser Seite habe ich einiges über den grundsätzlichen Aufbau von Zip-Files zusammengestellt. Ich erhebe nicht den Anspruch auf Vollständigkeit. Die aufgeführten Regeln sind das absolute Minimum, um Zip-Files in der beabsichtigten Weise analysieren (nicht dekomprimieren) zu können.
Das Zip-Format wurde zuerst von der Firma PKWARE Inc. benutzt. Seine Details waren lange ein wohl gehütetes Firmengeheimnis. Es handelt sich dabei um ein Kompressionsverfahren, das in seinem Grundprinzip einem modifizierten Lempel-Ziv-Algorithmus folgt. Alle im Zip-Archiv enthaltene Datei sind dabei einzeln kodiert, wobei die Methode im Detail sich nach den Eigenschaften der jeweiligen Datei richtet.
Jede komprimierte Datei ist durch ihren eigenen Header gekennzeichnet. Dieser Vorspann wird durch ein vier Byte langes Kennzeichen "PK34", im Folgenden LocalFileHeaderSign genannt, eingeleitet. Der lokale Dateikopf hat eine feste Struktur mit den Feldern gemäß Tabelle 1.
Feld | Byte | Bedeutung |
---|---|---|
LocalFileHeaderSign | (4) | PK34 (HEX: 50 4B 03 04) |
Version | (2) | Version |
Flag | (2) | |
CompresMethod | (2) | Kompressionsmethode |
DateTime | (4) | Datum und Uhrzeit |
CRC32 | (4) | CRC32 Prüfsumme |
CompresSize | (4) | gepackte Größe |
UncompresSize | (4) | ungepackte Größe |
FileNameLen | (2) | Dateinamenslänge |
ExtraFldLen | (2) | ExtraFeldLänge |
Dem Kopf-Datensatz folgt ohne Trennzeichen und ohne Abschluß der unkomprimierte Dateiname. Seine Länge ist dem Feld FileNameLength zu entnehmen.
Unter Umständen schließt sich dann ein ExtraField an. Dessen Länge ist ebenfalls aus dem Kopfblock über ExtraFieldLength zu ermitteln.
Danach folgt der Datenstrom der komprimierten Inhaltsdatei. Seine Länge ist im Feld CompressedSize des Headers eingetragen. Die angewandte Kodierungsmethode steht im Feld CompresMethod.
Damit ist eine Datei im Zip-Archiv abgearbeitet. Die beschriebene Anordnung wiederholt sich über alle im Zip-File enthaltenen Dateien. Nach der letzten Datei steht ein weiteres Kennzeichen, das aus den vier Byte "PK12" als CentralFileHeaderSign besteht.
Dieses leitet den Abschnitt der zentralen Dateikennungen ein. Hier stehen in dichter Folge im Sinne eines Directory noch einmal alle im Archiv enthaltenen Dateinamen nebst beschreibenden Datenangaben.
Jeder Dateieintrag dieses Abschnitts beginnt mit dem CentralFileHeaderSign. Es folgt pro enthaltener Datei ein Datensatz gemäß Tabelle 2.
Feld | Byte | Bedeutung |
---|---|---|
CentralFileHeaderSign | (4) | PK12 (Hex: 50 4B 01 02) |
VersionMade | (2) | Version beim Packen |
VersionNeed | (2) | Version zum Entpacken |
Flag | (2) | |
CompresMethod | (2) | Kompressionsmethode |
DateTime | (4) | Datum und Uhrzeit |
CRC32 | (4) | CRC32 Prüfsumme |
CompresSize | (4) | gepackte Größe |
UncompresSize | (4) | ungepackte Größe |
FileNameLen | (2) | Dateinamenslänge |
ExtraFldLen | (2) | ExtraFeldLänge |
FileCommentLen | (2) | Dateikommentarlänge |
StartOnDisk | (2) | Diskettennummer |
IntFileAttrib | (2) | internes Dateiattribut |
ExtFileAttrib | (4) | externes Dateiattribut |
RelOffLocalHdr | (4) | Offset des lokalen DateiHeaders |
Nach diesem fixen Datenblock folgt der original Dateiname und gegebenenfalls ein archivinterner Kommentar zu dieser Inhaltsdatei.
Nachdem alle im Zip-Archiv verzeichneten Dateien so aufgeführt wurden, folgt mit "PK56" als EndCentralDirSign ein weiteres spezielles Kennzeichen. Es schließen sich noch einige Angaben an, die das Gesamtarchiv charakterisieren. Dazu wird eine Datenstruktur nach Tabelle 3 verwendet:
Feld | Byte | Bedeutung |
---|---|---|
EndCentralDirSign | (4) | PK56 (Hex: 50 4B 05 06) |
DiskNo | (2) | Disketten-Nummer |
CentralDiskNo | (2) | Disketten-Nummer des Zentralverzeichnisses |
CentralEntries | (2) | Anzahl der Einträge auf dieser Diskette |
TotalEntries | (2) | Anzahl der Einträge im Zentralverzeichnis |
CentralSize | (4) | Größe des Zentralverzeichnisses |
CentralOffSet | (4) | Offset des Zentralverzeichnisses |
ZipCommentLen | (2) | Archivkommentarlänge |
Falls vorgesehen, ergänzt im Anschluß daran ein Archivkommentar das Zip-Archiv. Anderenfalls endet das Zip-File mit diesem Datensatz.
In Archiven, die sich über mehrere Disketten erstrecken gibt es noch das Kennzeichen "PK78" als ExtLocalSig.Handelt es sich um eine selbstextrahierende Datei als SFX-Archiv, liegt der Programmcode zum Entpacken vor den Zip-Daten. Einen verbindlichen Anfangspunkt für die komprimierten Daten gibt es in derartigen Archiven nicht.
Damit ist der Grundaufbau im Datenformat jeglichen Zip-Archives beschrieben. Was Sie damit anfangen können, erfahren Sie beispielsweise auf der Seite über den Zip-Viewer.Eine detaillierte Darstellung der Komprimierungsmethoden der einzelnen Dateninhalte finden Sie im Original unter ftp.pkware.com/appnote.zip. An dieser Stelle sei darauf verzichtet. Praktische Umsetzungen der Spezifikation entnehmen Sie am besten freien Softwarekomponenten zur Komprimierung und Dekomprimierung von Zip-Dateien, wie sie beispielsweise unter www.torry.ru/compressstd.htm gesammelt sind.
J. Hummel, Mai 2000
[ Programmierung ] [ Zip-Programmierung ]