web-dev-qa-db-fra.com

Utiliser Gzip pour compresser / décompresser un tableau d'octets

J'ai besoin de compresser un tableau d'octets. J'ai donc écrit cet extrait:

 class Program
    {
        static void Main()
        {
            var test = "foo bar baz";

            var compressed = Compress(Encoding.UTF8.GetBytes(test));
            var decompressed = Decompress(compressed);
            Console.WriteLine("size of initial table = " + test.Length);
            Console.WriteLine("size of compressed table = " + compressed.Length);
            Console.WriteLine("size of  decompressed table = " + decompressed.Length);
            Console.WriteLine(Encoding.UTF8.GetString(decompressed));
            Console.ReadKey();
        }

        static byte[] Compress(byte[] data)
        {
            using (var compressedStream = new MemoryStream())
            using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress))
            {
                zipStream.Write(data, 0, data.Length);
                zipStream.Close();
                return compressedStream.ToArray();
            }
        }

        static byte[] Decompress(byte[] data)
        {
            using (var compressedStream = new MemoryStream(data))
            using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
            using (var resultStream = new MemoryStream())
            {
                zipStream.CopyTo(resultStream);
                return resultStream.ToArray();
            }
        }
    }

Le problème est que j'obtiens cette sortie:

output

Je ne comprends pas pourquoi la taille du tableau compressé est supérieure à celle décompressée!

Des idées?

Modifier

après le commentaire de @ spender: si je change la chaîne test par exemple:

var test = "foo bar baz very long string for example hdgfgfhfghfghfghfghfghfghfghfghfghfghfhg";

J'obtiens un résultat différent. Quelle est donc la taille minimale du tableau initial à compresser?

13
Lamloumi Afif

Le fichier compressé a des en-têtes et augmente la taille du fichier, lorsque la taille d'entrée est très petite, la sortie peut être encore plus grande comme vous le voyez. essayez-le avec un fichier de plus grande taille.

En effet, la quantité de données est si faible que les frais généraux du format de compression l'emportent sur le gain de compression.

Essayez plus de données.

Si vous compressiez des données entièrement aléatoires (ou des données déjà compressées telles que jpeg), vous ne feriez jamais de gain significatif. Cependant, la chaîne new String('*',1000000) se comprimerait très bien.

GZIP ajoute au moins 18 octets, donc tout ce qui est en dessous ou légèrement au-dessus de cette taille qui est facilement compressible n'en bénéficiera pas.

Voici une question intéressante qui approfondit GZIP: Quel est le maximum que GZIP ou DEFLATE peut augmenter la taille d'un fichier?

1
spender