52 votes

Comment décompresser une chaîne Gzip en ruby ?

Zlib::GzipReader peut prendre en entrée "un objet IO, ou similaire à IO", comme indiqué dans la documentation.

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 décompresser une chaîne de caractères ?

123voto

Garth Points 726

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.

La solution que j'ai mise en place est la suivante :

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read

3 votes

Merci, j'avais la même erreur et cela a résolu mon problème !

0 votes

L'appel à body.to_s est-il redondant ?

19voto

Zlib suppose par défaut que vos données compressées contiennent un en-tête. Si vos données ne contiennent PAS d'en-tête, il échouera en levant un Zlib::DataError.

Vous pouvez dire à Zlib de supposer que les données n'ont pas d'en-tête en utilisant la solution de contournement suivante :

def inflate(string)
  zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end

16voto

dimus Points 2396

Vous devez Zlib::Gonfler pour la décompression d'une chaîne de caractères et Zlib::Deflate pour la compression.

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end

13voto

Tyler Points 21

Dans Rails, vous pouvez utiliser :

  • ActiveSupport::Gzip.compress("my string")
  • ActiveSupport::Gzip.decompress() .

7voto

BearPy Points 11

Zstream = Zlib::Inflate.new(16+Zlib::MAX_WBITS)

2 votes

Joli coup. De les docs "ou ajouter 16 pour décoder uniquement le format gzip (une Zlib::DataError sera levée pour un flux non-gzip)"

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