[ zurück ]

###
Programmierung von Zip-Programmen mit den Delphi

### Über das Zip-File-Format

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

Tabelle 1: Dieser Vorspann steht vor jedem komprimierten Dateistrom im Zip-Archiv

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

Tabelle 2: Datenstruktur einer Datei im zentralen Dateiverzeichnis eines Zip-Archives

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

Tabelle 3: Abschlußblock eines Zip-Archives

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 ]