使用 LZMA SDK

  • 首先是MinGW调用VC编译出的DLL

      LZMA SDK 4.65默认是VC项目,懒得再写makefile了,就直接用VS2008编译吧!还好,压缩/解压核心代码是C的,为保证DLL最大兼容性,选用__cdecl,按C代码编译。得到DLL后,需要使用MinGW中自带的dlltool工具将其转为.a文件:

dlltool -U -D LZMA.DLL -d LZMA.def -l LZMA.a

      转换过程,def文件是必须有的(从SDK中可以找到,找不到拿工具转),得到的.a文件很小,只有3K左右。然后使用“-L库文件路径”、“-l库文件名(不带.a)”作为参数来编译项目。注意,此路径下不可有与.a文件同名的.lib文件(记得编译DLL时生成的一个.lib文件吧?赶紧删了!),否则,会得到“undefined reference to…”的链接错误。

  • 使用压缩函数LzmaCompress

      本以为压缩函数的输出缓冲区与输入缓冲区相等就可以了,如果你压缩时该函数返回7(SZ_ERROR_OUTPUT_EOF)就说明压缩后的数据大于原数据。为了避免该错误出现,有两种选择:

1、出现该返回值时,说明压缩后的文件将大于压缩前的文件,可以考虑放弃使用压缩。

2、使得输出缓冲区大小至少为1.1×原数据大小 + 16K(使用LZMA算法,默认参数)/为1.001×原数据大小 + 32(使用LZMA2算法,该算法自动检测数据是否可压缩)

  • LzmaCompress的输出结果

      该函数的输出结果并不写文件头,我们可以使用props缓冲区的5bytes和*destLen的8bytes一起作为文件头。

引用文献

posted @ 2010-08-16 18:34  紫红的泪  阅读(7591)  评论(0编辑  收藏  举报