ZLIB库使用心得与疑惑

来源:互联网 发布:江西财经大学就业知乎 编辑:程序博客网 时间:2024/05/09 01:02

 

    由于项目需要,所以接触并使用了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)

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

 

原创粉丝点击