DeflateDeflate (englisch für „die Luft herauslassen“) ist ein Algorithmus zur verlustlosen Datenkompression. Er wurde von Phil Katz für das ZIP-Archivformat entwickelt und im Jahr 1989[1] der Gemeinfreiheit zugeführt. BeschreibungBei Deflate handelt es sich um eine Kombination des Lempel-Ziv-Storer-Szymanski-Algorithmus und der Huffman-Kodierung. LZSS ersetzt dabei Zeichenfolgen, die mehrmals vorkommen. Danach erfolgt eine Entropiekodierung nach Huffman. Es gibt eine Reihe von Parametern für Deflate, mit denen man Ausführungsgeschwindigkeit und Reduktionsrate beeinflussen kann:
Komprimierung wird in zwei Schritten erreicht:
BitstromformatEin Deflate-Datenstrom (Stream) besteht aus einer Folge von Blöcken. Jedem Block ist ein 3-Bit-Header vorangestellt:
Die meisten Blöcke werden mit Eliminierung doppelter ZeichenkettenWird innerhalb eines zu komprimierenden Blocks eine Folge sich wiederholender Bytes (entspricht einer sich wiederholenden Zeichenkette) gefunden, wird diese mit einer Rückwärtsreferenz ersetzt. Diese zeigt auf ein vorheriges Vorkommen der Zeichenkette. Ein Treffer auf eine vorherige Zeichenkette besteht aus Länge (3 bis 258 Bytes) und einer Distanz (1 bis 32.768 Bytes). Diese Rückwärtsreferenz kann sich über beliebig viele Blöcke erstrecken, muss aber innerhalb der Distanz von 32 KiB innerhalb der bereits dekomprimierten Daten (also innerhalb des sliding window) liegen. BitreduktionDie zweite Phase der Komprimierung besteht aus dem Ersetzen häufig genutzter Symbole (Zeichen) durch kürzere Darstellungsformen und seltenerer Symbole (Zeichen) durch Darstellungsformen, die geringfügig mehr Platz benötigen. Diese Methode der Huffman-Kodierung erzeugt einen präfixlosen Baum mit sich nicht überlappenden Abständen, in dem die Länge jeder Bitfolge umgekehrt proportional zu der Wahrscheinlichkeit des Auftretens des jeweiligen Symbols steht: Je häufiger ein Symbol auftritt, desto kürzer lässt sich dessen Bitfolge zum Kodieren darstellen. Es wird ein Baum erzeugt, der für 288 Symbole Platz bietet:
Der Trefferlänge folgt immer die Distanz. Abhängig vom Code werden möglicherweise weitere extra Bits gelesen, um die endgültige Distanz zu ermitteln. Der Distanzbaum besteht aus 32 Symbolen:
Man beachte, dass für die Symbole 2 bis 29 die Anzahl der Extra-Bits wie folgt berechnet werden kann: . Deflate64/Enhanced DeflateDeflate64 ist eine proprietäre Variante des Deflate-Algorithmus. Der zugrundeliegende Mechanismus bleibt unverändert.[2] Einzige Veränderungen sind:
Im Vergleich zu Deflate verbessert sich bei Deflate64 die Kompressionsrate geringfügig. Gleichzeitig dauert die Komprimierung aber auch etwas länger. Neben PKZIP und einer Vielzahl kommerzieller Anwendungen unterstützen auch viele Open-Source-Projekte wie zum Beispiel 7-Zip oder Info-ZIP Deflate64. Zlib unterstützt Deflate64 nicht. Grund ist die zu geringe Gesamtverbesserung und die Entscheidung, Deflate64 als proprietäres Format zu behandeln. VerwendungDeflate wird unter anderem in folgenden gebräuchlichen Formaten benutzt:
Es ist das gebräuchliche Verfahren für komprimierte HTTP-Übertragungen, siehe Artikel Hypertext Transfer Protocol, Abschnitt HTTP-Kompression. ImplementierungenDie freie Programmbibliothek zlib abstrahiert die Benutzung von Deflate für die Verwendung in anderen Programmen. Über 500 Programme benutzen den Algorithmus auf diesem Wege.[3] Die historische erste Implementierung erfolgte in Phil Katz’ PKZIP. Es existiert eine Vielzahl weiterer Implementierungen in einer Reihe unterschiedlicher Programmiersprachen, namentlich unter anderem in Java,[4] Ada,[5] Pascal,[6] JavaScript[7][8] und Seed7,[9] oder mit anderen Spezialisierungen. 7-Zip enthält eine eigene Implementierung, die für die Einführung einer stärkeren, rechenintensiveren Kompressionsstufe bekannt wurde. KZIP von Ken Silverman ist eine spezialisierte eigene Implementierung, die auf kleinstmögliche Dateigrößen zielt und einige Zeit als das beste verfügbare Werkzeug für diese Nische galt. Die freie Referenzimplementierung des Zopfli-Algorithmus komprimiert üblicherweise noch kompakter. GeschichteKatz implementierte nach Vorbild von LHA den 1982 veröffentlichten Lempel-Ziv-Storer-Szymanski-Algorithmus, der eine Verbesserung gegenüber dem alten Lempel-Ziv-Algorithmus von 1977 darstellte. Deflate wurde 1993 mit Version 2 der Software PKZIP von Phil Katz’ Firma PKWare Inc. eingeführt. Die exakte Spezifikation von Deflate und dem zugehörigen Bitstrom-Format ist im RFC 1951[10] vom Mai 1996 festgehalten. Weblinks
Einzelnachweise
|