2 votes

Php's gzcompress in Java

Je tente de compresser une chaîne en Java comme le fait la fonction gzcompress de php. Mais je n'obtiens pas les mêmes tableaux d'octets en résultat.

Mon code php :

';
for ($i=0; $i';
}
?>

Le résultat :

Ceci est un test

[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 

Code 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("Échec de la compression GZIP : " + e, e);
        }
    }

    public static void main(String[] args) {
        String input = "Ceci est un test";
        System.out.println("Entrée :  " + input);
        byte[] compressed = compressString(input);
        for (int i = 0; i < compressed.length; i++) {
            System.out.println("[" + i + "] = " + (compressed[i] & 0xFF));
        }
    }
}

Le résultat :

Entrée : Ceci est un test

[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 

Les parties intermédiaires des tableaux compressés sont les mêmes. Mais ils sont différents au début et à la fin.

5voto

Ian Roberts Points 59836

La documentation de la fonction gzcompress spécifie explicitement que l'algorithme de compression qu'elle utilise est zlib, ce qui est

différent de la compression gzip, qui inclut des données d'en-tête. Voir gzencode() pour la compression gzip.

La classe GZIPOutputStream de Java effectue une compression gzip appropriée incluant les bons en-têtes. DeflaterOutputStream fait simplement une compression deflate sans les en-têtes gzip, ce qui peut être plus proche de ce que vous recherchez, ou il existe des solutions tierces telles que JZlib.

3voto

Peter Lawrey Points 229686

According to the the RFC http://www.gzip.org/zlib/rfc-gzip.html

Its states that the start of the file should contain.

ID1 (IDentification 1) ID2 (IDentification 2) These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 (0x8b, \213), to identify the file as being in gzip format.

CM (Compression Method) This identifies the compression method used in the file. CM = 0-7 are reserved. CM = 8 denotes the "deflate" compression method, which is the one customarily used by gzip and which is documented elsewhere.

So the first three bytes should be 31, 139, 8. The fourth byte should be a value between 0-31 (using bits 0 to 4, and 5,6, and 7 are reserved). I suspect the output you see in PHP is not gz format.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X