2016-05-12 11 views
4

Ich frage mich, wie DEFLATE Blockgröße bestimmt (ich meine, in zlib.)Wie bestimmt DEFLATE (zlib) die Blockgröße?

In RFC 1591 folgende Erklärung gibt: „Der Kompressor einen Block endet, wenn es feststellt, dass wäre ein neuer Block mit frischen Bäume beginnen nützlich oder wenn die Blockgröße den Blockpuffer des Kompressors füllt. "

Es ist nicht genug für mich. Ich möchte wissen, welche Bedingung benötigt wird, um den aktuellen Block zu beenden und den neuen Block im Detail zu starten.

Wie entscheidet DEFLATE, ob frische Bäume nützlich sind oder nicht? Was ist die Größe des Kompressorblockpuffers?

Antwort

4

zlibs Deflate beendet den Block, wenn entweder der aktuelle Symbolpuffer voll ist (standardmäßig 16.383 Symbole) oder die Eingabedaten vollständig sind (Z_FINISH wurde angefordert). deflate in zlib versucht nicht zu beurteilen, wann es sinnvoll ist, einen Block früher zu beenden.

Ein Symbol in diesem Fall ist entweder ein Literal oder eine Übereinstimmung beliebiger Länge. Die Größe des Symbolpuffers wird durch den Parameter memLevel von deflateInit2() bestimmt. A memLevel von 8, die standardmäßig von deflateInit() verwendet wird, ergibt 16.383 Symbole. memLevel kann 1 bis 9 sein, wobei die Symbolpuffergröße (1 << (memLevel + 6)) - 1 ist.

+0

Scheint mir eine triviale Optimierung am Anfang des nächsten Blocks, nimm die Unterschiede zwischen alter und neuer Codelänge und multipliziere diese mit den entsprechenden Symbolhäufigkeiten. Wenn die Summe kleiner als die Größe des Endcodes plus der Größe der neuen Tabelle ist und die neue Tabelle keine Codes mit der Länge Null verwendet, verschieben Sie sie und geben Sie den neuen Block mit der alten Tabelle aus. – sh1