tgz programa para desde descomprimir como bz2 archivos archivo abrir ruby gzip zlib

ruby - programa - descomprimir un bz2 linux



¿Cómo descomprimir la cuerda de Gzip en rubí? (9)

Zlib :: GzipReader puede tomar "un objeto IO, o IO-like". como es 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?


El método anterior no funcionó para mí.
Seguí recibiendo error de incorrect header check (Zlib::DataError) . Aparentemente, supone que tiene 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


En Rails puedes usar:

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

Necesita 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


No necesitamos ningún parámetro adicional estos días. Hay métodos de clase deflate e inflate que permiten el uso de marcadores 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 la pregunta "¿Cómo debo descomprimir una cadena?" el mejor. :)


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

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

Cuidado con los problemas de codificación


Usando (-Zlib::MAX_WBITS) , obtuve 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


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

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

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

sin la línea zstream.finish!

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


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

Puede decirle a Zlib que asuma que los datos no tienen encabezado mediante la siguiente solución alternativa:

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


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