3

因此,我的 Java 应用程序接收了一些使用 PHP 的 gzdeflate() 生成的数据。现在我正在尝试用 Java 扩充这些数据。这是我到目前为止所得到的:

InflaterInputStream inflInstream = new InflaterInputStream(new ByteArrayInputStream(inputData.getBytes() ), new Inflater());

byte bytes[] = new byte[1024];
while (true) {
    int length = inflInstream.read(bytes, 0, 1024);
    if (length == -1)  break;

    System.out.write(bytes, 0, length);
}

'inputData' 是一个包含压缩数据的字符串。

问题是: .read 方法抛出异常:

java.util.zip.ZipException:不正确的标头检查

关于这个主题的其他网站只会将我重定向到 Inflater 类的文档,但显然我不知道如何使用它来与 PHP 兼容。

4

2 回答 2

11

根据文档,php gzdeflate() 生成原始 deflate 数据 (RFC 1951),但 Java 的Inflater 类需要 zlib (RFC 1950) 数据,这是包装在 zlib 标头和尾部的原始 deflate 数据。 除非您对 Inflater 构造函数指定nowrap 为 true 。然后它将解码原始放气数据。

InputStream inflInstream = new InflaterInputStream(new ByteArrayInputStream(inputData.getBytes()), 
                                                   new Inflater(true));

byte bytes[] = new byte[1024];
while (true) {
    int length = inflInstream.read(bytes, 0, 1024);
    if (length == -1)  break;

    System.out.write(bytes, 0, length);
}
于 2012-07-09T19:29:32.770 回答
1

按照示例使用 GZIPInputStream(不要直接使用 Inflater):

http://java.sun.com/developer/technicalArticles/Programming/compression/

于 2012-07-09T16:42:08.003 回答