Flux de compression compatibles Zlib?
Sont Système.IO.La Compression.GZipStream ou d'un Système.IO.La Compression.Dégonfler compatible avec la compression zlib?
source d'informationauteur Ben Collins
Vous devez vous connecter pour publier un commentaire.
De MSDN sur le Système.IO.La Compression.GZipStream:
De la zlib FAQ:
Donc zlib et GZipStream doivent être interopérables, mais seulement si vous utilisez la librairie zlib fonctions pour la manipulation de l'gzip format.
Système.IO.La Compression.Dégonfler et zlib auraient pas interopérables.
Si vous avez besoin de manipuler des fichiers zip (vous n'avez probablement pas, mais quelqu'un d'autre pourrait avoir besoin de), vous devez utiliser SharpZipLib ou d'une autre bibliothèque tierce.
DotNetZip comprend un DeflateStream, un ZlibStream, et un GZipStream, pour gérer les RFC (1950, 1951, 1952. La toute utilisation de l'Algorithme DEFLATE, mais le cadrage et les octets d'en-tête sont différentes pour chacun.
Comme un avantage, les cours d'eau dans DotNetZip ne présentent pas les anomalie de l'expansion de la taille des données sous compression, rapporté à l'encontre de la intégré dans les cours d'eau. Aussi, il n'est pas intégré dans le ZlibStream, alors que DotNetZip vous donne que, pour une bonne interopérabilité avec zlib.
J'ai rencontré ce problème avec les objets Git. Dans ce cas particulier, ils conservent les objets, comme dégonflé gouttes avec un Zlib-tête, qui est documenté dans RFC 1950. Vous pouvez faire un compatible blob en faisant un fichier qui contient:
0x78 0x01
CM
= 8 = dégonflerCINFO
= 7 = 32 ko fenêtreFCHECK
= 1 = somme de contrôle bits pour cet en-têteDeflateStream
DeflateStream
format big-endian (MSB en premier)J'ai fait ma propre Adler mise en œuvre
Et que c'était un peu ça.
J'ai utilisé GZipStream compresser la sortie de la .NET XmlSerializer et cela a fonctionné parfaitement bien pour décompresser le résultat avec gunzip (cygwin), winzip et un autre GZipStream.
Pour référence, voici ce que j'ai fait dans le code:
Alors, pour décompresser en c#
En utilisant le fichier " utilitaire dans cygwin révèle en effet qu'il existe une différence entre le même fichier compressé avec GZipStream et avec GNU GZip (probablement les informations d'en-tête, comme les autres, a déclaré à ce sujet). Cette différence, toutefois, ne semble pas d'importance dans la pratique.
gzip est dégonfler + quelques en-tête/pied de page de données, comme une somme de contrôle et longueur, etc. Ils ne sont donc pas compatibles dans le sens qu'une méthode peut utiliser un ruisseau de l'autre, mais ils utilisent le même algorithme de compression.
Ils ont juste compresser les données à l'aide de la librairie zlib ou dégonfler les algorithmes , mais n'offre pas de sortie pour certains format de fichier spécifique. Cela signifie que si vous stockez le flux en tant que-est le disque dur le plus probablement, vous ne serez pas en mesure de l'ouvrir à l'aide de certaines applications (gzip ou winrar) parce que les en-têtes de fichier (numéro de magic, etc ) ne sont pas inclus dans un flux, vous devez écrire vous-même.
À partir de .NET Framework 4.5 le
System.IO.Compression.DeflateStream
classe utilise la bibliothèque zlib.À partir de la classe de Article MSDN:
Je suis d'accord avec andreas. Vous ne serez probablement pas en mesure d'ouvrir le fichier dans un outil externe, mais si cet outil s'attend à un cours d'eau, vous pourriez être en mesure de l'utiliser. Vous serait également en mesure de dégonfler le fichier à l'aide de la même classe de compression.