Procédure de décompression Gzip chaîne en ruby?
Zlib::GzipReader peut prendre "un IO, ou IO-comme, l'objet". comme il est d'entrée, comme indiqué dans les docs.
Zlib::GzipReader.open('hoge.gz') {|gz|
print gz.read
}
File.open('hoge.gz') do |f|
gz = Zlib::GzipReader.new(f)
print gz.read
gz.close
end
Comment dois-je ungzip une chaîne de caractères?
Vous devez vous connecter pour publier un commentaire.
La méthode ci-dessus ne fonctionne pas pour moi.
J'ai continué à obtenir
incorrect header check (Zlib::DataError)
erreur. Apparemment, cela suppose que vous ayez un en-tête par défaut, ce qui peut ne pas toujours être le cas.Le travail autour de ce que j'ai mis en place a été:
Zlib par défaut asumes que vos données compressées contient un en-tête.
Si vos données ne contient PAS d'en-tête, il va échouer, en soulevant une Zlib::DataError.
Vous pouvez dire Zlib à assumer les données n'a pas d'en-tête via la solution de contournement suivante:
Vous avez besoin Zlib::Gonfler pour la décompression d'une chaîne et Zlib::Dégonfler pour la compression
zstream = Zlib::Gonfler.de nouveaux(16+Zlib::MAX_WBITS)
Dans les Rails, vous pouvez utiliser:
ActiveSupport::Gzip.compress("my string")
ActiveSupport::Gzip.decompress()
.À l'aide de
(-Zlib::MAX_WBITS)
, j'ai euERROR: invalid code lengths set
etERROR: invalid block type
La seule suite qui fonctionne pour moi, trop.
À gunzip contenu, utilisez le code suivant (testé sur 1.9.2)
Méfiez-vous des problèmes d'encodage de
Nous n'avons pas besoin des paramètres supplémentaires ces jours-ci. Il y a
deflate
etinflate
les méthodes de la classe qui permettent une rapide oneliners comme celles-ci:Je pense qu'il répond à la question "Comment dois-je ungzip une chaîne de caractères?" le meilleur. 🙂
J'ai utilisé la réponse ci-dessus à utiliser un Zlib::Dégonfler
J'ai continué à obtenir des fichiers endommagés (pour les petits fichiers) et il a fallu de nombreuses heures pour comprendre que le problème peut être résolu en utilisant:
sans le zstream.ligne d'arrivée!