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 ?

5voto

john Points 31

Utilisation de (-Zlib::MAX_WBITS) J'ai eu ERROR: invalid code lengths set y ERROR: invalid block type
Le seul suivant fonctionne pour moi aussi.

Zlib::GzipReader.new(StringIO.new(response_body)).read

3voto

Abdo Points 3360

J'ai utilisé la réponse ci-dessus pour utiliser un Zlib::Deflate

Je n'arrêtais pas de recevoir des fichiers cassés (pour les petits fichiers) et il m'a fallu de nombreuses heures pour comprendre que le problème pouvait être résolu en utilisant le logiciel :

buf = zstream.deflate(string,Zlib::FINISH)

sans le zstream.finish line !

def self.deflate(string)
    zstream = Zlib::Deflate.new
    buf = zstream.deflate(string,Zlib::FINISH)
    zstream.close
    buf
end

3voto

pinguin666 Points 316

Pour gunzip le 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

3voto

dadooda Points 506

Nous n'avons pas besoin de paramètres supplémentaires de nos jours. Il y a deflate y inflate Les méthodes de la classe qui permettent de réaliser des oneliners rapides comme ceux-ci :

>> data = "Hello, Zlib!"
>> compressed = Zlib::Deflate.deflate(data)
=> "x\234\363H\315\311\311\327Q\210\312\311LR\004\000\032\305\003\363"
>> uncompressed = Zlib::Inflate.inflate(compressed)
=> "Hello, Zlib!"

Je pense que c'est ce qui répond le mieux à la question "Comment décompresser une chaîne de caractères" :)

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