linux下c使用lzma_使用 LZMA SDK

linux下c使用lzma_使用 LZMA SDK首先是 MinGW 调用 VC 编译出的 DLLLZMASDK4 65 默认是 VC 项目 懒得再写 makefile 了 就直接用 VS2008 编译吧 还好 压缩 解压核心代码是 C 的 为保证 DLL 最大兼容性 选用 cdecl 按 C 代码编译 得到 DLL 后 需要使用 MinGW 中自带的 dlltool 工具将其转为 a 文件 dlltool U DLZMA DLL dLZMA def lLZMA a 转换过

首先是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一起作为文件头。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231125.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号