2

PHP の gzcompress 関数が行うように、Java で文字列を圧縮しようとします。しかし、結果として同じバイト配列を取得できません。

私のphpコード:

<?php
echo 'This is a test';
$compressed = gzcompress('This is a test');
echo '<br>';
for ($i=0; $i<strlen($compressed); $i++) {
    echo '['.$i.'] = '.ord($compressed[$i]).'<br>';
}
?>

結果:

これはテストです

[0] = 120 
[1] = 156 
[2] = 11 
[3] = 201 
[4] = 200 
[5] = 44 
[6] = 86 
[7] = 0 
[8] = 162 
[9] = 68 
[10] = 133 
[11] = 146 
[12] = 212 
[13] = 226 
[14] = 18 
[15] = 0 
[16] = 36 
[17] = 115 
[18] = 4 
[19] = 246 

Java コード:

public class Main {

    public static byte[] compressString(String uncompressedString) throws IllegalArgumentException, IllegalStateException {
        try {
            byte[] utfEncodedBytes = uncompressedString.getBytes();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(baos)) {
                gzipOutputStream.write(utfEncodedBytes);
                gzipOutputStream.finish();
            }
            return baos.toByteArray();
        } catch (Exception e) {
            throw new IllegalStateException("GZIP compression failed: " + e, e);
        }
    }

    public static void main(String[] args) {
        String input = "This is a test";
        System.out.println("Input:  " + input);
        byte[] compressed = compressString(input);
        for (int i = 0; i < compressed.length; i++) {
            System.out.println("[" + i + "] = " + (compressed[i] & 0xFF));
        }
    }
}

結果:

入力: これはテストです

[0] = 31 
[1] = 139 
[2] = 8 
[3] = 0 
[4] = 0 
[5] = 0 
[6] = 0 
[7] = 0 
[8] = 0 
[9] = 0 
[10] = 11 
[11] = 201 
[12] = 200 
[13] = 44 
[14] = 86 
[15] = 0 
[16] = 162 
[17] = 68 
[18] = 133 
[19] = 146 
[20] = 212 
[21] = 226 
[22] = 18 
[23] = 0 
[24] = 50 
[25] = 159 
[26] = 122 
[27] = 192 
[28] = 14
[29] = 0 
[30] = 0 
[31] = 0 

圧縮された配列の中間部分は同じです。しかし、最初と最後では違います。

4

2 に答える 2

5

gzcompress 関数のドキュメントには、使用する圧縮アルゴリズムが zlib であることが具体的に記載されています。

一部のヘッダー データを含む gzip 圧縮とは異なります。gzip 圧縮については gzencode() を参照してください。

Java の GZIPOutputStream は、適切なヘッダーを含む適切な gzip 圧縮を行います。DeflaterOutputStream は、gzip ヘッダーなしで単純な deflate を実行します。これは、目的に近いか、JZlibなどのサードパーティのソリューションがあります。

于 2012-08-26T10:19:16.870 に答える
3

RFCによるとhttp://www.gzip.org/zlib/rfc-gzip.html

ファイルの先頭に含まれるべきであると述べています。

ID1(IDentification 1)ID2(IDentification 2)これらの値は固定値ID1 = 31(0x1f、\ 037)、ID2 = 139(0x8b、\ 213)で、ファイルがgzip形式であることを識別します。

CM(圧縮方式)ファイルで使用されている圧縮方式を識別します。CM=0-7は予約されています。CM = 8は、「deflate」圧縮方法を示します。これは、gzipで通常使用される方法であり、他の場所で文書化されています。

したがって、最初の3バイトは31、139、8である必要があります。4番目のバイトは0〜31の値である必要があります(ビット0〜4を使用し、5、6、および7は予約されています)。PHPで表示される出力はgz形式ではないと思います。

于 2012-08-26T10:03:37.273 に答える