52 votes

Classe GZipStream ou DeflateStream?

La documentation MSDN me dit:

Le GZipStream classe utilise le gzip format de données, qui comprend une cyclique contrôle de redondance de la valeur pour la détection de la corruption des données. Le gzip format de données utilise le même algorithme de compression comme le DeflateStream classe.

Il semble GZipStream ajoute quelques données supplémentaires à la sortie (par rapport à DeflateStream). Je me demandais, dans ce type de scénario, il serait essentiel d'utiliser GZipStream et pas DeflateStream?

70voto

Aaronaught Points 73049

Dégonfler est juste l'algorithme de compression. GZip est en fait un format.

Si vous utilisez l' GZipStream pour compresser un fichier (et l'enregistrer avec l'extension .gz), le résultat peut effectivement être ouvert par les archivistes comme WinZip ou l' gzip outil. Si vous compressez avec un DeflateStream, ces outils ne reconnaît pas le fichier.

Si le fichier compressé est conçu pour être ouvert par ces outils, il est essentiel d'utiliser GZipStream au lieu de DeflateStream.

Je voudrais aussi qu'il est essentiel si vous êtes le transfert d'une grande quantité de données sur un moyen fiable (c'est à dire une connexion internet) et non pas à l'aide d'une correction d'erreur de protocole comme TCP/IP. Par exemple, vous pourriez être la transmission sur un port série, raw socket, ou UDP. Dans ce cas, vous seriez certainement voulez le CRC de l'information qui est incorporé dans le GZip format afin de s'assurer que les données sont correctes.

12voto

agnain Points 57

GZipStream est identique à DeflateStream, mais il ajoute un CRC pour s’assurer que les données ne contiennent pas d’erreur.

6voto

n535 Points 2558

Eh bien, j'avais complètement tort dans ma première réponse. J'ai consulté le code source Mono et constaté que la classe GZipStream redirige en réalité ses appels en lecture / écriture (et presque tous les autres) vers des appels appropriés de méthodes d'un objet interne DeflateStream:

 public override int Read (byte[] dest, int dest_offset, int count)
{
    return deflateStream.Read(dest, dest_offset, count);
}

public override void Write (byte[] src, int src_offset, int count)
{
    deflateStream.Write (src, src_offset, count);
}
 

La seule différence est qu'il crée toujours un objet DeflateStream avec un indicateur gzip défini sur true. Ce n'est certainement pas une réponse à votre question, mais peut-être que ça va aider un peu.

2voto

Quandary Points 12867

Dito selon Aaronaught

Notez une autre différence importante selon
http://www.webpronews.com/gzip-vs-deflate-compression-and-performance-2006-12 :

J'ai mesuré le DeflateStream à 41% plus rapide que GZip.

Je n'ai pas mesuré la vitesse, mais j'ai mesuré la taille du fichier pour être appx. le même.

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