7zip核心算法LZMA源码分析心得

7zip核心算法LZMA分析心得

  • 最近有空就研究了一下DEFLATE的LZ77压缩算法实现及7zip的LZMA压缩算法实现,现在记下相关心得如下:

一、 DEFLATE中的LZ77算法实现比较简单,具体研究的是github上的一个精简版实现miniz,源码可见https://gitee.com/tigerzyj/miniz。有几个要点要注意,一是基于字节流的字典匹配,二是哈夫曼编码,详情可以参阅RFC1951,那里说的很清楚了。有特色是哈夫曼编码的ALISTAIR MOFFAT实现方法,有些难理解,找到他的论文并亲自在纸上推算一下就能理解了。

二、
7zip中的LZMA编码是在LZ77算法上加入了基于比特流及马尔科夫链上下文的区间编码(range code)以及基于动态规划(Dynamic Programming)的深度优化,并扩大了DEFLATE中32K的字典到默认的8M(或16M,根据版本不同),理论上最大可以到4G,实际实现中最大为1536 MB,32位7zip实现中最大为128M。详情可以参见维基百科上的https://en.wikipedia.org/wiki/Lempel–Ziv–Markov_chain_algorithm,(转载地址https://www.cnblogs.com/tigerzyj/p/15334782.html)文章其它地方说得比较清楚,但DP优化说得很简单,不太好理解,看了源码花了N个小时才算看明白。具体看的源码是lzma1900的cs实现,这个实现与java实现比较容易理解。下载地址为
https://www.7-zip.org/a/lzma19

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
7-zip 是一种高效的压缩算法,它能够提供比传统的 ZIP 压缩算法更高的压缩比率和更快的压缩速度。同时,它还支持多种压缩格式,包括 7z、ZIP、RAR、GZIP、TAR 等。 如果你想在 C 语言中使用 7-zip 的压缩算法,你可以使用 7-zip 的 C SDK。该 SDK 提供了一组 C 语言 API,可以让你在你的程序中使用 7-zip 的压缩和解压缩功能。 以下是使用 7-zip C SDK 进行压缩的基本步骤: 1. 包含 7-zip C SDK 的头文件。 ``` #include <7z.h> ``` 2. 定义一个结构体来存储压缩参数。 ``` CLzmaEncProps props; LzmaEncProps_Init(&props); props.level = 5; ``` 3. 打开要压缩的文件。 ``` HANDLE inFile = CreateFileA("input.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ``` 4. 创建一个输出文件。 ``` HANDLE outFile = CreateFileA("output.7z", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ``` 5. 初始化 7-zip 压缩库。 ``` ISzAlloc alloc = { SzAlloc, SzFree }; CLzmaEncHandle enc; LzmaEnc_Construct(&enc); LzmaEnc_Alloc(&enc, 1024 * 1024, &alloc, &alloc); LzmaEnc_SetProps(&enc, &props); LzmaEnc_WriteProperties(&enc, outFile); ``` 6. 压缩文件。 ``` const int bufferSize = 64 * 1024; Byte inBuffer[bufferSize]; Byte outBuffer[bufferSize]; SZ_RESULT res = SZ_OK; UInt32 inSize = 0; UInt64 outSize = 0; for (;;) { DWORD bytesRead = 0; if (!ReadFile(inFile, inBuffer, bufferSize, &bytesRead, NULL)) { res = SZ_ERROR_READ; break; } if (bytesRead == 0) { break; } inSize += bytesRead; SRes res = LzmaEnc_Encode(&enc, outBuffer, &outSize, inBuffer, bytesRead, LZMA_FINISH_ANY); if (res != SZ_OK) { break; } DWORD bytesWritten = 0; if (!WriteFile(outFile, outBuffer, outSize, &bytesWritten, NULL)) { res = SZ_ERROR_WRITE; break; } } ``` 7. 关闭文件和 7-zip 压缩库。 ``` CloseHandle(inFile); CloseHandle(outFile); LzmaEnc_Destroy(&enc); ``` 这就是使用 7-zip C SDK 进行压缩的基本步骤。你可以根据你的具体需求进行调整和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值