Можете ли вы помочь с созданием zip-архива с помощью LZMA (7zip) SDK?

Я пытаюсь использовать LZMA SDK для создания zip-архива (в формате.zip или.7z). Я скачал и собрал SDK, и я просто хочу использовать экспорт dll для сжатия или распаковки нескольких файлов. Когда я использую метод LzamCompress, он возвращает 0 (SZ_OK), как будто он работал правильно. Однако после того, как я запишу буфер в файл и попытаюсь открыть его, я получаю сообщение об ошибке, что файл не может быть открыт как архив.

Вот код, который я сейчас использую. Мы ценим любые предложения.

#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;
}

1 ответ

Решение

Я не знаю конкретно о LZMA, но из того, что я знаю о сжатии в целом, похоже, что вы записываете сжатый поток битов в файл без какой-либо информации заголовка, которая позволила бы программе распаковки узнать, как сжат поток битов.

Функция LzmaCompress(), вероятно, записывает эту информацию в outProps. В SDK должна быть другая функция, которая будет принимать сжатый поток битов в outBuffer и свойства в outProps и создавать из них надлежащий архив.

Другие вопросы по тегам