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)