Comment décompresser la chaîne Gzip dans ruby?
Zlib::GzipReader peut prendre "un IO, ou IO-objet similaire."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 décompresser une chaîne?
9 réponses
la méthode ci-dessus n'a pas fonctionné pour moi.
J'ai continué à obtenir incorrect header check (Zlib::DataError)
erreur. Apparemment, il suppose que vous avez un en-tête par défaut, ce qui n'est pas toujours le cas.
le travail que j'ai mis en place était:
require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))
uncompressed_string = gz.read
Zlib par défaut suppose que vos données compressées contiennent un en-tête. Si vos données ne contiennent pas d'en-tête, elles échoueront en soulevant un Zlib::DataError.
Vous pouvez dire à Zlib de supposer que les données n'ont pas d'en-tête via la solution suivante:
def inflate(string)
zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
Vous avez besoin d' Zlib::Gonfler pour la décompression d'une chaîne et Zlib::Deflate pour la compression
def inflate(string)
zstream = Zlib::Inflate.new
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
en utilisant (-Zlib::MAX_WBITS)
, j'ai ERROR: invalid code lengths set
et ERROR: invalid block type
La seule suite qui fonctionne pour moi, trop.
Zlib::GzipReader.new(StringIO.new(response_body)).read
dans les Rails vous pouvez utiliser:
ActiveSupport::Gzip.compress("my string")
ActiveSupport::Gzip.decompress()
.
nous n'avons pas besoin de paramètres supplémentaires de nos jours. Il y a deflate
et inflate
classe de méthodes qui permettent rapide oneliners comme celles-ci:
>> data = "Hello, Zlib!"
>> compressed = Zlib::Deflate.deflate(data)
=> "x43H5117Q021LR402533"
>> uncompressed = Zlib::Inflate.inflate(compressed)
=> "Hello, Zlib!"
je pense qu'il répond à la question "Comment dois-je ungzip une chaîne de caractères?" Best. :)
j'ai utilisé la réponse ci-dessus pour utiliser un Zlib::Deflate
j'ai continué à obtenir des fichiers cassés (pour les petits fichiers) et il a fallu de nombreuses heures pour comprendre que le problème peut être corrigé en utilisant:
buf = zstream.deflate(string,Zlib::FINISH)
sans le zstream.ligne d'arrivée!
def self.deflate(string)
zstream = Zlib::Deflate.new
buf = zstream.deflate(string,Zlib::FINISH)
zstream.close
buf
end
gunzip contenu, utilisez le code suivant (testé sur 1.9.2)
Zlib::GzipReader.new(StringIO.new(content), :external_encoding => content.encoding).read
attention aux problèmes d'encodage