有哪些不同的zlib压缩方法以及如何在Java的Deflater中强制使用默认值?

我使用DeflaterOutputStream压缩数据作为专有存档文件格式的一部分.我正在使用jcraft zlib代码在另一端解压缩该数据.另一端是J2ME应用程序,因此我依赖第三方zip解压缩代码而不是标准Java库.

我的问题是一些文件压缩和解压缩就好了,而其他文件没有.

对于那些没有的,数据的第一个字节中的压缩方法似乎是’5′.

从我在zlib上的阅读中,我知道默认值’8’表示默认的deflate压缩方法.任何其他值似乎都是解压缩程序不可接受的.

我想知道的是:

>’5’表示什么?
>为什么DeflaterOutputStream在某些时候使用不同的压缩方法?
>我可以阻止它以某种方式这样做吗?
>是否有另一种方法来生成仅使用默认压缩方法的泄露数据?

解决方法:

它可能有助于精确了解您正在查看的内容.

在整个数据之前,通常有一个双字节的ZLIB头.据我所知,这些的第一个字节的低4位应始终为8.如果你在nowrap模式下初始化你的Deflater,那么你根本不会得到这两个字节(尽管你的其他库必须期待不要得到他们).

然后,在每个单独的数据块之前,有一个3位的块头(通知,定义为多个位,而不是整数个字节).可以想象,您可以使用以字节5开头的块,这将指示作为最终块的压缩块,或者使用字节8,这将是非压缩的非最终块.

当您创建DeflaterOutputStream时,您可以传入Deflater或您选择构造函数,并且在该Defalter上,您可以设置一些选项.该级别基本上是在查找数据中的重复模式时压缩使用的预测量;在offchance上,您可以尝试将其设置为非默认值,看看它是否对您的解压缩程序是否可以应对有任何影响.

策略设置(参见setStrategy()方法)可以在某些特殊情况下使用,告诉deflater仅应用huffman压缩.在您已经转换数据以使值的频率接近2的负幂(即霍夫曼编码最佳的分布)的情况下,这偶尔会有用.我不希望这个设置影响图书馆是否可以读取你的数据,但是你可能会尝试更改此设置.

如果它有用,我已经写了一些关于configuring Deflater的内容,包括在转换数据上使用仅霍夫曼压缩.我必须承认,无论你选择哪种方案,我都希望你的图书馆能够读取数据.如果您确定您的压缩数据是正确的(即ZLIB / Inflater可以重新读取您的文件),那么您可能会考虑使用另一个库…!

哦,并说出明显的出血,但无论如何我会提到它,如果你的数据是固定的,你当然可以把它放在罐子里,它将有效地放气/充气“免费”.具有讽刺意味的是,您的J2ME设备必须能够解码zlib压缩数据,因为这基本上就是jar所在的格式……

上一篇:zlib.output_compression off – 如何测试是否真的禁用了PHP压缩?


下一篇:我可以使用什么库来计算Java或Scala中的大型稀疏矩阵?