ZLIB库使用心得与疑惑

 

    由于项目需要,所以接触并使用了ZLIB库。ZLIB是通用压缩库,著名的ZIP软件使用的就是ZLIB库。在JAVA中,内置了ZLIB,所以可以直接调用,在网络中流淌的很多压缩后的数据流,就是使用ZLIB处理的。关于ZLIB中使用的LZ77和HUFFMAN编码,这里不作介绍。现在只想说下ZLIB的应用。

    在C编写的ZLIB库中,也就是直接从http://www.zlib.net/载下来的库里,有很多参数可以设置,这样可以很灵活的压缩原始数据。例如,MAX_MEM_LEVEL 用来设置压缩级别,即压缩时使用的空间和最终的压缩率之间的一个参数;MAX_WBITS LZ77窗口长度,越长,压缩率就越好,同时,压缩需要空间越大。这些参数在C的ZLIB库里有,然而在JAVA的SPI里就没有,所以说JAVA中的ZLIB使用起来不灵活。

    1,使用C下ZLIB库压缩,JAVA下ZLIB解压。

    由于是在嵌入式环境下压缩数据,对空间大小要求很高,在将MAX_MEM_LEVEL = 1,MAX_WBITS = 8后,ZLIB使用了8896Bytes的动态内存空间。

    而在JAVA端,只需要选择默认参数即可进行解压。

 

    2,JAVA端ZLIB压缩,C下解压

    由于JAVA的ZLIB调用,只有少的可怜的参数,无法设定起压缩级别,也就是说,解压端也必须按照默认方式去解压,那将意味着32768 + 11520 Bytes的动态内存申请。这在嵌入式下的应用是不可接受的事情。

   

    遇到的问题:解压缩时可以通过设置MAX_WBITS 而达到设置需要动态申请内存大小的目的。将MAX_WBITS设为9(压缩端为8,解压段至少要比压缩段大),程序只是申请了9520Bytes的内存,用来存放inflate需要的基本数据结构。而库说明中提到的

    inflate memory usage (bytes) = (1 << windowBits) + 1440*2*sizeof(int)

    完全没有出现。这是一个悬而未绝的问题。只能先放着了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值