Cómo descomprimir Gzip string en ruby?


Zlib::GzipReader puede tomar "un objeto IO, o similar a IO."como su entrada, como se indica en los documentos.

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

¿Cómo debo descomprimir una cadena?

Author: Kris, 2009-09-01

9 answers

El método anterior no funcionó para mí.
Seguí recibiendo incorrect header check (Zlib::DataError) error. Aparentemente asume que tienes un encabezado por defecto, lo que puede no ser siempre el caso.

El trabajo que implementé fue:

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read
 110
Author: Garth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-30 16:34:15

Zlib por defecto asume que sus datos comprimidos contienen un encabezado. Si sus datos NO contienen un encabezado, fallará al generar un Zlib::DataError.

Puede decirle a Zlib que asuma que los datos no tienen encabezado a través de la siguiente solución:

def inflate(string)
  zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end
 18
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-15 19:03:50

Necesitas Zlib:: Inflate para la descompresión de una cadena y Zlib::Deflate para la compresión

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end
 15
Author: dimus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-01 11:36:20

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

 6
Author: BearPy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-16 05:09:48

Usando (-Zlib::MAX_WBITS), tengo ERROR: invalid code lengths set y ERROR: invalid block type
El único siguiente funciona para mí, también.

Zlib::GzipReader.new(StringIO.new(response_body)).read
 5
Author: john,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-25 01:05:32

En Rails puedes usar:

  • ActiveSupport::Gzip.compress("my string")
  • ActiveSupport::Gzip.decompress().
 5
Author: Tyler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-12 21:10:00

No necesitamos ningún parámetro adicional en estos días. Hay deflate y inflate métodos de clase que permiten oneliners rápidos como estos:

>> 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!"

Creo que responde a la pregunta "¿Cómo debo descomprimir una cadena?"el mejor. :)

 3
Author: Alex Fortuna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-18 09:59:43

Usé la respuesta anterior para usar un Zlib::Deflate

Seguí recibiendo archivos rotos (para archivos pequeños) y me llevó muchas horas descubrir que el problema se puede solucionar usando:

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

Sin el zstream.línea de meta!

def self.deflate(string)
    zstream = Zlib::Deflate.new
    buf = zstream.deflate(string,Zlib::FINISH)
    zstream.close
    buf
end
 2
Author: Abdo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 20:15:44

Para el contenido de gunzip, use el siguiente código (probado en 1.9.2)

Zlib::GzipReader.new(StringIO.new(content), :external_encoding => content.encoding).read

Tenga cuidado con los problemas de codificación

 2
Author: pinguin666,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-18 09:28:08