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?
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
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
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
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)
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
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()
.
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. :)
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
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
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