Comment gonfler un fichier avec zlib.NET?
Je suis en utilisant le zlib.NET de la bibliothèque de l'essayer et de gonfler les fichiers qui sont compressés par zlib (sur une machine Linux, peut-être). Voici ce que j'ai fais:
zlib.ZInputStream zinput =
new zlib.ZInputStream(File.Open(path, FileMode.Open, FileAccess.Read));
while (stopByte != (data = zinput.ReadByte()))
{
//check data here
}
zinput.Close();
Les octets de données correspondent à la compression de données en octets, donc je dois avoir fait quelque chose de mal.
Pour gérer gzip/zlib/dégonflage des fichiers compressés, même si les données compressées commence dans le milieu du fichier, j'ai trouvé offzip outil mentionné sur reverseengineering.se utile. Il trouve et extrait des flux comprimés indépendamment de l'endroit où ils commencent dans le fichier. Avec les bons paramètres de ligne de commande ça fonctionne si c'est un pur dégonfler flux sans en-tête.
OriginalL'auteur Ben Collins | 2008-10-09
Vous devez vous connecter pour publier un commentaire.
Autres que de ne pas utiliser une "aide" déclaration de fermer le flux de données, même dans le visage d'une exception, qui semble correct pour moi. Les données sont certainement comprimé? Êtes-vous en mesure de le décompresser avec zlib sous linux?
Avoir regardé le code source, c'est assez horrible - un appel à
int Read(buffer, offset, length)
finiront par appeler son interneint Read()
méthodelength
fois par exemple. Étant donné que le tri des débuts difficiles, je ne suis pas sûr que j'avais confiance le code particulièrement lourd, mais j'aurais attendu qu'il fonctionne au moins légèrement! Avez-vous essayé d'utiliser SharpZipLib?OriginalL'auteur Jon Skeet
Il semble j'ai fait l'erreur de supposer que toutes les méthodes virtuelles ont été annulés, ce qui n'était pas le cas. J'ai été en utilisant la librairie zlib.ZInputStream.ReadByte(), qui est à seulement hérité du Flux.ReadByte(), qui ne fait pas gonfler.
J'ai utilisé la librairie zlib.ZInputStream.Lire() à la place, et cela a fonctionné comme il se doit.
ouais, en fait, il ne modifie pas
Read
soit, plutôt que la mise en œuvre deread
. Il remplace également les BinaryReader, pas de Flux, ce qui est maladroit. Depuis, j'ai passé à l'aide de la bibliothèque de DotNetZip deIonic.Zlib
espace de noms, qui a une bonneStream
basée sur la mise en œuvre. zlib.NET n'est tout simplement pas adapté pour une utilisation en production, et il est vraiment juste un teaser pour un produit payant de toute façon.Il suffit de frapper sur cette même question. Ne suis pas convaincu par l'zlib.NET! Pourquoi sur la terre ne
ZInputStream
pas remplacerStream
? Au lieu de cela, il remplaceBinaryReader
, et de manière incomplète! Je n'aime pas toutes les solutions ici semblent suggérer la copie de la dégonflé flux de données en mémoire. Je vais essayer Ionique.ZLib comme vous le suggérez. Merci.OriginalL'auteur Ben Collins
Sauter la zlib-tête (deux premiers octets,
78 9C
), puis à l'aide de laDeflateStream
construit dans .net a fonctionné pour moi.x
ou, si vous êtes en base64, commence aveceJ
OriginalL'auteur CodesInChaos
Le code ci-dessous pourrait vous aider les gars. Instancier l'objet et d'utiliser les fonctions.
OriginalL'auteur
Regarder le code de plus près, c'est de la copie de données à partir d'une Filestream pour la ZOutputStream. La décompression doit se passer à travers cette couche.
OriginalL'auteur Brendan Kowitz
J'ai récemment eu le malheur de service docs précédemment zlib avais à l'aide de php à une variété de navigateurs et plates-formes, y compris IE7. Une fois que j'ai compris que les docs ont été zlib d et ne pas gzip (comme il a été pensé à l'époque), j'ai utilisé SharpZipLib de la manière suivante .NET Framework v4 (en prenant avantage de Flux de données.CopyTo):
Pensé que je pourrais le mettre ici au cas où quelqu'un a besoin d'aide avec les classes à utiliser à partir de SharpZipLib.
OriginalL'auteur Scotty.NET