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:ヘッダーチェックが正しくありません

このテーマに関する他のWebサイトは、私をInflaterクラスのドキュメントにリダイレクトするところまでしか行きませんが、PHPと互換性を持たせるためにそれを使用する方法がわからないようです。

4

2 に答える 2

11

ドキュメントによると、php gzdeflate ()は生のdeflateデータ(RFC 1951)を生成しますが、JavaのInflaterクラスはzlib(RFC 1950)データを期待しています。これはzlibヘッダーとトレーラーにラップされた生のdeflateデータです。 Inflaterコンストラクターに対してtrueとしてnowrapを指定しない限り。次に、生の収縮データをデコードします。

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 に答える