Können Sie mit dem Erstellen einer ZIP-Archiv mit dem LZMA (7zip) SDK helfen?

StackOverflow https://stackoverflow.com/questions/1875147

  •  18-09-2019
  •  | 
  •  

Frage

Ich versuche, das LZMA SDK zu verwenden, um ein ZIP-Archiv zu erstellen (entweder .zip oder .7z-Format). Ich habe heruntergeladen und baute das SDK und ich möchte nur die dll Exporte verwenden, ein paar Dateien zu komprimieren oder dekomprimieren. Wenn ich die LzamCompress Methode verwenden, gibt es 0 (SZ_OK), als ob es korrekt funktioniert. Doch nachdem ich den Puffer-Datei und versuchen Sie schreiben, es zu öffnen, ich erhalte eine Fehlermeldung, dass die Datei nicht als Archiv geöffnet werden.

Hier ist der Code, den ich zur Zeit benutzen. Alle Vorschläge würden geschätzt.

#include "lzmalib.h"

typedef unsigned char byte;

using namespace std;

int main()
{
    int length = 0;
    char *inBuffer;

    byte *outBuffer = 0;
    size_t outSize;
    size_t outPropsSize = 5;
    byte * outProps = new byte[outPropsSize];

    fstream in;
    fstream out;

    in.open("c:\\temp\\test.exe", ios::in | ios::binary);

    in.seekg(0, ios::end);
    length = in.tellg();
    in.seekg(0, ios::beg);

    inBuffer = new char[length];

    outSize = (size_t) length / 20 * 21 + ( 1 << 16 ); //allocate 105% of file size for destination buffer

    if(outSize != 0)
    {
        outBuffer = (byte*)malloc((size_t)outSize);
        if(outBuffer == 0)
        {
            cout << "can't allocate output buffer" << endl;
            exit(1);
        }
    }

    in.read(inBuffer, length);
    in.close();

    int ret = LzmaCompress(
        outBuffer, /* output buffer */
        &outSize, /* output buffer size */
        reinterpret_cast<byte*>(inBuffer),/* input buffer */
        length, /* input buffer size */
        outProps, /* archive properties out buffer */
        &outPropsSize,/* archive properties out buffer size */
        5, /* compression level, 5 is default */
        1<<24,/* dictionary size, 16MB is default */
        -1, -1, -1, -1, -1/* -1 means use default options for remaining arguments */
    );

    if(ret != SZ_OK)
    {
        cout << "There was an error creating the archive." << endl;
        exit(1);
    }

    out.open("test.zip", ios::out | ios::binary);

    out.write(reinterpret_cast<char*>(outBuffer), (int)(outSize));
    out.close();

    delete inBuffer;
    delete outBuffer;
}
War es hilfreich?

Lösung

Ich weiß nicht, über LZMA speziell, aber von dem, was ich von Kompression im Allgemeinen weiß, es sieht aus wie Sie einen komprimierten Bitstrom in eine Datei ohne Header-Informationen schreiben, die ein Dekomprimierungsprogramm wissen, wie der Bitstrom lassen würden, ist komprimiert.

Die LzmaCompress () Funktion wahrscheinlich schreibt diese Informationen in outProps. Es sollte eine andere Funktion im SDK sein, der den komprimierten Bitstrom in outBuffer und die Eigenschaften in outProps nehmen und ein richtiges Archiv von ihnen erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top