'Zip-Archiv' is the first release of a file compression and
decompression program that compresses data using a 12/13 bit Huffman
algorithm.

Written in 1994 by Peter Troxler, Student at the Swiss Federal
Institute of Technology, Haldenackerweg 1, 4663 Aarburg, Switzerland.



    Ŀ
                                                     
            Format von 'Zip-Archiv'-Dateien          
                                                     
    




Diese Datei enthlt Informationen ber das Format von Dateien, welche
mit 'Zip-Archiv' gepackt wurden. Es wendet sich vor allem an technisch
interessierte Anwender mit einigen Programmierkenntnissen.





Allgemeines:

'Zip-Archiv' arbeitet mit einer leicht modifizierten Huffman-Codierung.
Das heisst, fr Zeichen und Zeichenketten werden stellvertretende
Bitfolgen variabler Lnge erzeugt. Zeichenen oder Zeichenketten,
die besonders hufig vorkommen, wird ein sehr kurzer Bit-Code
zugeordnet. Andererseits entspricht einem seltenen Zeichen ein relativ
langer Code.

Als Beispiel betrachte man die den folgenden Text:

'CCACBBCD'

Normalerweise werden dafr 8 Byte (8 Zeichen  1 Byte) Speicher belegt.
Durch die Codierung nach Huffman wird ein sogenannter Baum fr die
Erzeugung der einzelnen Codes erstellt:


  0                           1
         Ŀ
         C          Ŀ
                    B    Ŀ
                         D   A

Dieser Baum ordnet nun jedem Zeichen A, B, C und D einen Code zu. Dabei
wird folgendermassen vorgegangen: Der Code sei am Anfang leer, d.h.
seine Lnge ist gleich Null. Um den Code fr ein beliebiges Zeichen
x  M  (M:=[A,B,C,D]) zu erhalten, wird der Baum von oben nach unten
traversiert. Bei jeder Verzweigung nach links wird dem Code eine Null,
bei jeder Verzweigung nach rechts eine Eins hinzugefgt. Fr die
Zeichen x  M erhalten wir also die Bitfolgen

A: 111
B: 10
C: 0
D: 110


Der Text 'CCACBBCD' lautet komprimiert:

0 0 111 0 10 10 0 110

und belegt in dieser Form keine 2 Byte Speicherplatz mehr!

In 'Zip-Archiv' habe ich die vielgelobte 12/13-Bit Huffman-Codierung
benutzt. Diese konkrete Form des Fuffman-Algorithmus erstellt nur
Codewrter mit einer Lnge von 9 bis 12 bzw. 13 Bit. Experimente
ergeben, dass das Verfahren fr diese Grssenordnung am effizientesten
arbeitet. Dabei spielt natrlich neben dem Komprimierungsgrad auch die
Geschwindigkeit eine erhebliche Rolle.

Es ist offensichtlich, dass fr jede Datenmenge, welche mit einem
anderen "Lexikon" (Codierungsbaum) bersetzt bzw. komprimiert wurde,
das Lexikon mitabgespeichert werden muss!





Der Infoblock:

Am Ende von jedem Archiv, das mit 'Zip-Archiv' erstellt wurde, befindet
sich das Inhaltsverzeichnis mit anschliessendem Info-Block. Wenn ein
Archiv also auf mehrere Disketten verteilt gespeichert wurde, ist das
Inhaltsverzeichnis und der Infoblock auf der letzten Diskette zu
finden.

Der Infoblock ist eine 7 Byte grosse Datenstruktur, die sich ganz am
Ende jedes Archivs befindet.

Er hat folgendes Format:

Byte n-6 und n-5:  Konfiguration                     (Word)
Byte n-4 und n-3:  Grsse des Inhaltsverzeichnisses  (Word)
Byte n-2 und n-1:  Kennzeichen fr Zip-Archiv        'PT'
Byte n:            Version                           (Byte)

n bezeichnet die Grsse des Archivs in Bytes. Die Version gibt an,
mit welcher Programmversion von 'Zip-Archiv' die entsprechende Datei
erstellt wurde. Dabei geben die 4 hherwertigen Bits die Vorkomma-,
die vier niederwertigen Bits die Nachkommastelle der Versionsnummer
bekannt.

Die einzelnen Bits des Konfigurationswortes haben folgende Bedeutung:

15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
                                          Geschwindigkeit
                                        Verzeichnisse mitabspeichern
                         
                          Archiv umfasst mehrere Dateien
                             (Nummer als Suffix)





Das Inhaltsverzeichnis:

Das Inhaltsverzeichnis ist direkt vor dem Infoblock abgelegt; seine
Lnge in Bytes ist aus dem Infoblock ersichtlich.

Der Aufbau des Inhaltsverzeichnisses unterscheidet sich geringfgig
fr das Komprimieren mit der Option -v bzw. ohne Option -v.

Werden die Dateien mit Verzeichnissen gepackt (Option -v), wird wie
folgt vorgegangen:


Schritt 1
---------
Zuerst speichert ZIP.EXE das ASCII-Zeichen #0, anschliessen das
Verzeichnis, von welchem die Dateien gelesen werden. Das Verzeichnis
wird mit einem Lngenbyte am Anfang und einem Backslash '\' am Ende
gespeichert.

Dieser Eintrag knnte so aussehen:

#0#18'C:\WINDOWS\SYSTEM\'


Schritt 2
---------
Unabhngig davon, ob die Dateien mit oder ohne Verzeichnisse gepackt
werden, fhrt 'Zip-Archiv' mit dem Abspeichern der Dateiattribute und
des Dateinamens fort:

In den vier niederwertigen Bits des ersten Bytes ist die Lnge des
folgenden Dateinamens gespeichert. Die restlichen vier Bits geben die
Dateiattribute des Programms an:

Bit 4: Read only (schreibgeschtzt)
Bit 5: Hidden (versteckt)
Bit 6: System-File
Bit 7: Archiv

Ein Beispiel:

#135'ZIP.DOK'

Das erste Zeichen mit ASCII-Code 135d entspricht dem binren 1000 0111.
Die Lnge des folgenden Strings 'ZIP.DOK' ist also 0111b=7d (die
Buchstaben b und d stehen fr binr und dezimal) und einzig und allein
das Archiv-Bit ist eingeschaltet.

Anschliessend wird in vier aufeinanderfolgenden Bytes die Grsse der
gepackten Datei gespeichert.

Werden die Dateien  ohne Option -v gepackt, wird Schritt 2 fr alle
gepackten Dateien wiederholt.

Werden die Dateien jedoch mit der Option -v komprimiert, wiederholen
sich die Schritte 1 und 2 fr alle gepackten Dateien, wobei Schritt 1
leicht abgendert wird:

Anstatt dem ASCII-Code Null wird in diesem Byte die Anzahl Zeichen
des aktuellen Pfads gespeichert, die mit dem zuvor abgespeicherten
Pfad bereinstimmen. Und anstelle des gesamten Verzeichnisses wird
nur noch derjenige Teil gespeichert, welcher neu, also nicht mehr mit
dem zuvor gespeicherten Pfad bereinstimmt.

Wenn beispielsweise die drei Dateien

C:\WINDOWS\WIN.COM
C:\WINDOWS\WINDOWS.HLP
C:\WRITER\HUNZIKER\BEWERBUN.WRI

ohne Option -v komprimiert werden, ergibt sich folgendes Inhaltsver-
zeichnis:

#7'WIN.COM'....#11'WINDOWS.HLP'....#12'BEWERBUN.WRI'....

Dabei wurde stillschweigend angenommen, dass alle drei Dateien keine
Dateiattribute besitzen! Die vier Punkte stehen stellvertretend fr
die Dateigrsse.

Wird beim Packen von der Option -v Gebrauch gemacht, ergibt sich
folgendes Bild:

#0#11'C:\WINDOWS\'#7'WIN.COM'....#11#0'WINDOWS.HLP'....
#4#6'RITER\'#12'BEWERBUN.WRI'....





Schlussbemerkung:

Das Programm ZIP.EXE wurde zum grssten Teil in Assembler und Pascal
geschrieben. Dabei wurden auch Entwicklertools wie Debugger und
Profiler zu Hilfe genommen.