LzmaLib: komprimiere / dekomprimiere Puffer in C

8

Ich versuche, LzmaLib 's LzmaCompress() und LzmaDecompress() mit Puffern zu verwenden und die Beispiele zur Verfügung gestellt hier .

Ich teste mit einem ~ 3MB Puffer und die Komprimierungsfunktion scheint gut zu funktionieren (erzeugt einen ~ 1,2MB komprimierten Puffer), aber wenn ich versuche, zu dekomprimieren, extrahiert es nur ~ 300 Bytes und gibt SZ_ERROR_DATA .

Die wenigen extrahierten Bytes sind richtig, aber ich weiß nicht, warum es dort aufhört.

Mein Code:

%Vor%

Wenn dieser Code nicht der bessere Weg ist, um Puffer mit LzmaLib zu komprimieren, nehme ich gerne Vorschläge an.

    
karliwson 22.11.2016, 02:43
quelle

3 Antworten

8

Ich wette, das Problem lauert darin, wie Sie Ihre Dateien lesen / schreiben. Sie müssen sie im Binärmodus öffnen, um Ersetzungen während Lese- / Schreibvorgängen zu verhindern.

Ändern Sie alle Vorkommen von:

  • fopen(xxx, "r") - & gt; %Code%
  • fopen(xxx, "rb") - & gt; %Code%
Codeguard 25.11.2016, 20:21
quelle
0

Ich habe dies nicht speziell für LzmaCompress überprüft, aber die meisten anderen Komprimierungsbibliotheken wie libz behandeln diese Funktion ähnlich wie die Standardfunktionen read / write oder fread / fwrite, dh Sie können die Funktionen fortlaufend aufrufen, um mehr zu komprimieren und mehr Daten in einem Stream. Irgendwann wirst du sagen müssen "Ich bin fertig, bitte spüle alles, was noch nicht geschrieben wurde". Möglicherweise haben Sie diesen Teil vergessen. Wenn nicht, wäre ein minimales, vollständiges und überprüfbares Beispiel cool.

    
Bodo Thiesen 22.11.2016 02:55
quelle
0

Wenn Sie komprimieren, übergeben Sie die Anzahl der komprimierten Ausgangsbyte an den Aufrufer. Aber Ihr Puffer enthält LZMA_PROPS_SIZE zusätzliche Bytes. Wenn Sie also die lzma-Datei schreiben, vergessen Sie tatsächlich die letzten LZMA_PROPS_SIZE Bytes und beim späteren Lesen fehlen diese.

    
Bodo Thiesen 22.11.2016 03:37
quelle

Tags und Links