java.util.zip.Deflater是否能够输出未经处理的deflate数据?

7

zlib文档指定可以向deflateInit2()函数传递负的windowBits参数:

windowBits也可以是-8..-15用于原始的deflate。在这种情况下,-windowBits确定窗口大小。deflate()将生成没有zlib头或尾部的原始deflate数据,并且不会计算adler32校验值。

我已经在我的C代码中使用了这个,在Java中可以通过将nowrap参数设置为true来解压缩这些字节,然后传递给Inflater构造函数。

然而,将true传递给Deflaternowrap参数不会产生原始压缩。它返回比我在C实现中得到的多20个字节,这确实听起来像是一个标题和校验和。(对于nowrap传递false将得到更长的字节数组。)
我已经浏览了Deflater docs,但没有找到指定窗口位或要求原始压缩的方法。这个库是否支持?或者我需要使用其他实现来在Java中获得原始压缩?

据我所知,将no-wrap参数设置为true是使用原始deflate的唯一方法。 - Jean-François Savard
жҲ‘и®Өдёәе°Ҷtrueдј йҖ’з»ҷnowrapеҸӮж•°дјҡдә§з”ҹRFC-1950 ZLIBз»“жһңгҖӮдј йҖ’falseдјҡдә§з”ҹRFC-1952 Gzipз»“жһңгҖӮжҲ‘жғіиҰҒзҡ„жҳҜRFC-1951еҺҹе§ӢDEFLATEз»“жһңгҖӮ - theory
你看过DeflaterOutputStreamDeflaterInputStream的可能性了吗?也许那会对你有所帮助。 - Jean-François Savard
是的。根据我所知,您需要将 InflaterDeflater 对象传递给它们的构造函数,在那里设置所有基于压缩的属性,而不是在流对象上设置。 - theory
那么我必须说抱歉,但我不能再试着帮助你了。我对java.util.zip的了解有限。这显然是我需要更加努力学习的东西。祝你好运。 - Jean-François Savard
1个回答

6

Deflater 会生成经过 zlib 封装的数据(RFC 1950)。Deflater(level, true) 则会生成未经处理的压缩数据(RFC 1951)。


嗯,为什么它比C实现的输出多20个字节呢? - theory
不同的压缩设置?不同的压缩代码?如果您提供前30个字节的十六进制,我可以验证是否有包装器。 - Mark Adler
C语言中的前30个字节压缩为6D52CB729B3014FD95EE531349084974260BBD3018830101356C327E24A91。我在Java中解压缩了它们,然后使用Deflater(DEFAULT_COMPRESSION, true)再次进行了压缩,并得到了以ED524D739B3014EC4FC9BD3591849044677290903018830101355C32FE485开头的字节。 - theory
这两个都是没有头部的原始压缩流。 - Mark Adler
嗯,你有任何想法为什么Java的那个比另一个长了19个字节吗? - theory
我已经给了你一些理论。你可能正在使用相同压缩代码的不同设置,或者是不同的压缩代码。 - Mark Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接