有哪些不同的zlib压缩方法,如何在Java';什么是平减器?

有哪些不同的zlib压缩方法,如何在Java';什么是平减器?,java,java-me,compression,zip,gzip,Java,Java Me,Compression,Zip,Gzip,我使用DeflaterOutputStream将数据压缩为专有归档文件格式的一部分。然后我使用jcraftzlib代码在另一端解压数据。另一端是J2ME应用程序,因此我依赖于第三方zip解压缩代码,而不是标准Java库 我的问题是,一些文件的压缩和解压都很好,而另一些则不行 对于不这样做的,数据第一个字节中的压缩方法似乎是“5” 从我对zlib的阅读中,我了解到默认值“8”表示默认的deflate压缩方法。任何其他值似乎都是解压缩程序无法接受的 我想知道的是: “5”表示什么 为什么Defla

我使用DeflaterOutputStream将数据压缩为专有归档文件格式的一部分。然后我使用jcraftzlib代码在另一端解压数据。另一端是J2ME应用程序,因此我依赖于第三方zip解压缩代码,而不是标准Java库

我的问题是,一些文件的压缩和解压都很好,而另一些则不行

对于不这样做的,数据第一个字节中的压缩方法似乎是“5”

从我对zlib的阅读中,我了解到默认值“8”表示默认的deflate压缩方法。任何其他值似乎都是解压缩程序无法接受的

我想知道的是:

  • “5”表示什么
  • 为什么DeflaterOutputStream有时会使用不同的压缩方法
  • 我能阻止它那样做吗
  • 是否有其他方法可以生成仅使用默认压缩方法的压缩数据

这可能有助于准确了解您所看到的内容


在整个数据之前,通常有一个两字节的ZLIB头。据我所知,它们的第一个字节的低位4位应始终为8。如果您在nowrap模式下初始化了Deflater,那么您将根本无法获得这两个字节(尽管您的另一个库一定希望不会获得它们)

然后,在每个单独的数据块之前,有一个3位块头(注意,定义为位的数量,而不是字节的整数)。可以想象,您可以有一个以字节5开头的块,它将指示一个压缩块,它是最终块;或者有一个以字节8开头的块,它将是一个非压缩、非最终块

创建DeflaterOutputStream时,可以将Deflater或您选择的内容传递给构造函数,在该Defalter上,可以设置一些选项。该级别本质上是压缩在查找数据中的重复模式时使用的前瞻量;很有可能,您可以尝试将其设置为非默认值,看看这是否会对您的解压程序是否能够处理产生任何影响

在某些特殊情况下,可以使用策略设置(请参见setStrategy()方法)来告知平减指数仅应用哈夫曼压缩。当您已经转换了数据,使值的频率接近2的负幂时(即,哈夫曼编码最适合的分布),这有时会很有用。我不认为此设置会影响库是否可以读取您的数据,但如果有机会,您可以尝试更改此设置

如果有帮助的话,我已经写了一点,包括对转换数据使用huffman-only压缩。我必须承认,无论您选择什么选项,我都希望您的库能够读取数据。如果你真的确信你压缩的数据是正确的(即ZLIB /充气机可以重新读取你的文件),那么你可以考虑只使用另一个库……p>
哦,说出血是很明显的,但我还是要提到它,如果你的数据是固定的,你当然可以把它放在罐子里,它将有效地“免费”放气/充气。具有讽刺意味的是,您的J2ME设备必须能够解码zlib压缩数据,因为这基本上就是jar所采用的格式…

Neil,您如何对哈夫曼编码和频率等了解这么多?啊哈。。我无意中设置了“nowrap”。谢谢,很高兴问题解决了!Cheeso-关于freqs的事情并不是那么特殊的知识——它实际上只是脱离了标准的信息理论。如果采用任意频率分布,理想的编码通常会将小数位数的比特分配给码字,这当然是不可能的。但是,如果字符的概率是2的负幂(即1/2、1/4、1/8等),理想的代码就有整数。“这些字符的第一个字节的下4位应该总是8”-这不是真的,是吗?RFC1950说“格式目前使用DEFLATE压缩方法,但可以很容易地扩展到使用其他压缩方法”。这里的DEFLATE指的是8。这意味着它不应该总是8。它应与所使用的压缩方法相对应。还是我在考虑不同的字节?