2014-09-09 25 views
7

ich LZ4 Bibliothek bin mit und wenn Daten mitLZ4 Bibliothek dekomprimiert obere Daten gebunden Größenschätzung

int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize); 

Dekomprimieren möchte ich maximal dekomprimiert Datengröße abzuschätzen. Aber ich kann nicht finden Reverse-Funktion von

int LZ4_compressBound(int isize); 

mit dem ich die oberen Grenze für die dekomprimierten Daten bestimmen kann, die maxDecompressedSize zum letzten Parameter zur Verfügung zu stellen, der Funktion dekomprimieren.

Andere Komprimierungsbibliotheken wie snappy zum Beispiel bietet eine solche Funktion.

bool GetUncompressedLength(Source* source, uint32* result); 

Was kann ich tun, wenn ich nicht Fähigkeit habe anfängliches Datenformat zu speichern (vor der Komprimierung), und wenn ich will nicht für die Größe des Puffers über pessimistisch sein, die ich zuteilen muß?

Antwort

6

Das maximale Komprimierungsverhältnis von LZ4 beträgt 255, so dass eine garantierte Überschätzung der dekomprimierten Datengröße die 255-fache Eingabegröße ist.

Das ist offensichtlich zu viel um wirklich nützlich zu sein, daher der Grund, warum es keine "reverse LZ4_compressBound()" Funktion gibt.

Ich fürchte, es gibt keinen anderen Weg als zu speichern oder zu wissen, die unkomprimierte Größe. Das LZ4-Komprimierungsformat "Raw" definiert keine Möglichkeit zum Speichern solcher Informationen, da die optimale Auswahl anwendungsspezifisch ist. Zum Beispiel weiß eine Anwendung im Voraus, dass kein Block> 16 KB sein kann, daher können sie maxDecompressedSize = 16 KB beim Aufruf von LZ4_decompress_safe() verwenden.

Wenn Sie nun nach einem Kuvertformat suchen, das diese Verantwortung übernimmt, können Sie entweder ein eigenes erstellen oder das LZ4 Framing-Format verwenden: http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html (auch als LZ4_Framing_Format.html im Quellpaket enthalten) . Ach, die Bibliothek in der Lage zu erzeugen und dieses Format gelesen wird derzeit in der Beta-Phase (https://github.com/Cyan4973/lz4/tree/frame)

6

nur als Referenz, n Bytes LZ4 komprimierte Daten bis zu 24 + 255 darstellen können (n - 10) unkomprimiert Bytes, was bei einem Lauf von so vielen Bytes der Fall ist. n muss mindestens zehn sein, um einen gültigen Stream zu erstellen, der ein Literal, eine Übereinstimmung und dann fünf Literale am Ende der Spezifikation enthält. Also könnte die dekomprimierte gebundene Funktion etwas wie (n << 8) - n - 2526 sein.

Das maximale Kompressionsverhältnis ist dann: 255-2526/n, die 255 asymptotisch für beliebig große n.

+0

Ich habe mir nie die Zeit genommen, um die genauen Grenzen so klar zu berechnen, wie Sie in diesem Beitrag getan haben. Danke für die einfachen Formeln! – Cyan