C++ 您能帮助使用LZMA(7zip)SDK创建zip存档吗?

C++ 您能帮助使用LZMA(7zip)SDK创建zip存档吗?,c++,lzma,C++,Lzma,我正在尝试使用创建zip存档(.zip或.7z格式)。我已经下载并构建了SDK,我只想使用dll导出来压缩或解压缩一些文件。当我使用lzampress方法时,它返回0(SZ_OK),就好像它工作正常一样。但是,在我将缓冲区写入文件并尝试打开它之后,我得到一个错误,即文件无法作为归档文件打开 这是我目前使用的代码。如有任何建议,将不胜感激 #include "lzmalib.h" typedef unsigned char byte; using namespace std; int mai

我正在尝试使用创建zip存档(.zip或.7z格式)。我已经下载并构建了SDK,我只想使用dll导出来压缩或解压缩一些文件。当我使用lzampress方法时,它返回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;
}
#包括“lzmalib.h”
typedef无符号字符字节;
使用名称空间std;
int main()
{
整数长度=0;
char*inBuffer;
字节*exputffer=0;
尺寸不要太大;
输出规模=5;
字节*outProps=新字节[outpropsize];
fstream-in;
流出;
in.open(“c:\\temp\\test.exe”,ios::in | ios::binary);
in.seekg(0,ios::end);
长度=in.tellg();
in.seekg(0,ios::beg);
inBuffer=新字符[长度];

outSize=(size_t)length/20*21+(1我不知道LZMA的具体情况,但从我对压缩的一般了解来看,似乎您正在将压缩位流写入一个文件,而没有任何头信息,可以让解压缩程序知道位流是如何压缩的


LzmaCompress()函数可能会将此信息写入outProps。SDK中应该有另一个函数,该函数将获取Outpuffer中的压缩位流和outProps中的属性,并从中创建适当的存档。

您如何尝试打开该文件?您使用的是7zip archiver程序还是LZMA SDK中的其他函数?都是7zip和windows zip文件夹实用程序。我也在尝试这样做,但仍然没有成功。需要注意的一些问题..1)最初的5个字节将是标题属性(outProps)接下来的8个字节是长度。2)然后是压缩数据。当我以这种方式写入时,它也会失败。我认为我们还需要添加“7”,“z”。我不确定。我放弃了,并编写了一个类来与7zip.exe接口:(这真的是最简单的方式吗?:[我可能也会这样做……这是我的想法,但dll只导出LzmaCompress和LzmaDecompress。如果你能用LzmaDecompress解压,这会解决你的问题吗?还是你必须生成一个与7zip兼容的存档文件?我想用LzmaDecompress解压可以,但当我尝试时,输出大小会变小仍然为0,即使函数返回SZ_OKI,但我在几年前使用zlib完成了此操作。我必须自己编写所有PKZIP元信息,zlib只生成压缩文件数据。显然这是不同的工具,但LZMA是一种压缩算法,而不是存档格式。因此,我对名为LzmaCompress的函数的期望是它不会不生成存档文件,只生成一些压缩数据。7zip文件以两个字节“7”、“z”开头,PKZIP以“P”、“K”、“03”、“04”开头。如果您没有看到这些,则它不是存档。至少不是您想要的任何一种格式。