2016-04-12 7 views
0

informiert Sie zlib, wenn Daten gepuffert werden und auf Deflate gewartet wird, bis eine anständige Datenmenge komprimiert ist? wäre eine der Variablen in Z_STREAM oder anderswo in der Lage dies zu zeigen?Gibt es eine Möglichkeit zu wissen, ob Deflate (oder Ihr Z_STREAM) Daten gepuffert hat? zlib C++

Grundsätzlich möchte ich den z-Stream erzwingen, aber nur am Ende der Datei (auf einer Datei, die ständig aktualisiert wird) also lesen, komprimieren bis eof, lesen, komprimieren bis eof usw. Wenn ich flush z_finish auf eof und dann resetdeflate vor dem nächsten lesen, das sollte den Trick richtig machen? Es sollte den Puffer leeren, den Strom zurücksetzen und weitermachen?

Antwort

1

Nein, Deflate hat keine Variable oder Funktion, die Ihnen sagt, wie viele Daten akkumuliert wurden, bevor komprimierte Daten ausgegeben werden. Es gibt eine andere Frage, die es beantworten kann, mit deflatePending(), die Ihnen sagen wird, wie viele komprimierte Bytes und Bits eines ausgegebenen Blocks noch in den Ausgabepuffer des Benutzers geschrieben werden müssen.

Ja, um einen Deflate-Stream zu beenden, verwenden Sie Z_FINISH und rufen dann deflate() auf, bis es keine Ausgabe mehr für Sie hat. Sie können dies mit einem deflateReset() verfolgen, um die Struktur erneut zu verwenden, um einen neuen Deflate-Stream zu starten.

Wenn Sie dies häufig tun, z. Für jede Zeile, die in eine Datei geschrieben wird, erhalten Sie eine miese Komprimierung, da eine einzelne Zeile normalerweise nicht sehr komprimierbar ist. Was Sie vielleicht suchen, ist etwas wie gzlog, das Zeilen zu einer komprimierten gzip-Datei hinzufügt und dabei seine Korrektheit als komprimierter gzip-Stream bei jedem Anhängen beibehält und dennoch eine gute Komprimierung bietet.