Можете ли вы помочь с созданием 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 и создавать из них надлежащий архив.