Lzma(7-zip)

在C目录中有算法文件,进入Util\LzmaLib目录,编译生成LIB库,导出了以下两函数,LzmaCompress 为压缩函数,LzmaUncompress 为解压缩函数。

MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen,
  unsigned char *outProps, size_t *outPropsSize,
  int level,     
  unsigned dictSize, 
  int lc,       
  int lp,       
  int pb,       
  int fb,       
  int numThreads
  );

MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen,
  const unsigned char *props, size_t propsSize);

导入Types.h 和 Lzmalib.h 到工程中。

代码如下:

#include "stdafx.h"
#include "LzmaLib.h"

#pragma comment(lib,"lzma.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    FILE* pFile = _tfopen(_T("file.dat"), _T("rb"));

    if (pFile == NULL)
    {
        _ftprintf(stderr, _T("Error to Open the file!"));
        return  - 1;
    }

    fseek(pFile, 0, SEEK_END);
    size_t srcLen = ftell(pFile);
    rewind(pFile);
    size_t destLen = srcLen * 2;
    unsigned char* psrcRead = new unsigned char[srcLen]; //原始文件数据
    unsigned char* pDecomress = new unsigned char[srcLen]; //存放解压缩数据
    unsigned char* pLzma = new unsigned char[destLen]; //存放压缩数据

    fread(psrcRead, sizeof(char), srcLen, pFile);

    unsigned char prop[5] = 
    {
        0
    };
    size_t sizeProp = 5;

    if (SZ_OK != LzmaCompress(pLzma, &destLen, psrcRead, srcLen, prop,
        &sizeProp, 9, (1 << 24), 3, 0, 2, 32, 2))
    {
        //出错了
        _ftprintf(stderr, _T("压缩时出错!"));
        delete [] psrcRead;
        delete [] pDecomress;
        delete [] pLzma;
        fclose(pFile);
        return  - 1;
    }

    FILE* pCompressFile = _tfopen(_T("compress.dat"), _T("wb")); 
    //写入压缩后的数据
    if (pCompressFile == NULL)
    {
        _ftprintf(stderr, _T("创建文件出错!"));
        delete [] psrcRead;
        delete [] pDecomress;
        delete [] pLzma;
        fclose(pFile);
        return  - 1;
    }
    fwrite(pLzma, sizeof(char), destLen, pCompressFile);
    fclose(pCompressFile);

    FILE* pDecompressFile = _tfopen(_T("decompress.dat"), _T("wb")); 
    //写入解压缩数据
    if (pDecompressFile == NULL)
    {
        _ftprintf(stderr, _T("写入数据出错!"));
        delete [] psrcRead;
        delete [] pDecomress;
        delete [] pLzma;
        fclose(pFile);
        return  - 1;
    }

    //注意:解压缩时props参数要使用压缩时生成的outProps,这样才能正常解压缩
    if (SZ_OK != LzmaUncompress(pDecomress, &srcLen, pLzma, &destLen, prop, 5))
    {
        delete [] psrcRead;
        delete [] pDecomress;
        delete [] pLzma;

        fclose(pDecompressFile);
        fclose(pFile);
        return  - 1;
    }

    fwrite(pDecomress, sizeof(char), srcLen, pDecompressFile);

    delete [] psrcRead;
    delete [] pDecomress;
    delete [] pLzma;

    fclose(pDecompressFile);
    fclose(pFile);

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
7-ZIP32.DLL 是一个供第三方软件调用进行压缩7z 或解压7z 的动态链接库。 2014/6/25 Version 9.22.00.01 新增的API。 (SevenZipGetLastError) 新增的API。 (SevenZipSfxConfigDialog) 新增的API。 (SevenZipSfxFileStoring) 支持长路径名。 (仅适用于基于NT的,在某种程度上是7-zip的本家兼容) 更改为返回FALSE,如果密码是错误指定CHECKARCHIVE_FULLCRC标志SevenZipCheckArchive。 加强错误处理。固定在没有返回现场应该返回一些错误。 定,如果缓冲区耗尽SevenZipGetArcFileName等来返回一个错误。 SevenZipGetMethod的略作修改的规范。相应的缓冲区不足的时间变化。 支持M_CHECK_FILENAME_ONLY国旗和M_CHECK_ALL_PATH在SevenZipOpenArchive。固定M_CHECK_FILENAME_ONLY的(“-R-”),是一个M_CHECK_ALL_PATH(“-R”)的默认状态。还可以支持(“-R0”)通过使用在同一时间的两个标志。 修正了无法显示的密码窗口时没有任何窗口的应用程序处理加密文件中的错误。 固定有在那里当然对话框的处理速度的项目显示100倍的情况。 修正了SevenZipGetArcAccessTimeEx必须得到更新的日期和时间的错误。 未安装-SLP到非支持的DLL,就像因此不能使用开关,一旦7-Zip文件管理器。 (您可以使用) 重建在7-ZIP9.22。 - 我可以在MF= FilterID开关指定压缩过滤器。下面的例子。 A-MF= BCJ2 a.7z a.tar A-MF=三角洲:4 a.7z a.wav A-MF= BCJ a.tar.xz a.tar - 我可以用最好的4GB内存在64位版本的Windows。 - 修正了几个错误。...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值