Как распаковать строку Gzip в ruby?
Zlib :: GzipReader может принимать "объект ввода-вывода или IO-подобный объект". как это вход, как указано в документах.
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
Как мне распаковать строку?
Ответы
Ответ 1
Вышеуказанный метод не работал у меня.
Я продолжал получать ошибку incorrect header check (Zlib::DataError)
. По-видимому, он предполагает, что у вас есть заголовок по умолчанию, что может не всегда быть.
Работа над этим я реализовал:
require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))
uncompressed_string = gz.read
Ответ 2
Zlib по умолчанию утверждает, что ваши сжатые данные содержат заголовок.
Если ваши данные НЕ содержат заголовок, он не сработает, подняв Zlib:: DataError.
Вы можете указать Zlib предположить, что данные не имеют заголовка с помощью следующего обходного пути:
def inflate(string)
zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
Ответ 3
Вам нужно Zlib:: Inflate для декомпрессии строки и Zlib:: Deflate для сжатия
def inflate(string)
zstream = Zlib::Inflate.new
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
Ответ 4
zstream = Zlib:: Inflate.new(16 + Zlib:: MAX_WBITS)
Ответ 5
В Rails вы можете использовать:
-
ActiveSupport::Gzip.compress("my string")
-
ActiveSupport::Gzip.decompress()
.
Ответ 6
Используя (-Zlib::MAX_WBITS)
, я получил ERROR: invalid code lengths set
и ERROR: invalid block type
Единственное, что работает для меня, тоже.
Zlib::GzipReader.new(StringIO.new(response_body)).read
Ответ 7
В наши дни нам не нужны дополнительные параметры. Существуют методы класса deflate
и inflate
, которые позволяют использовать такие быстрые oneliners:
>> 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!"
Я думаю, что он отвечает на вопрос "Как мне развязать строку?" лучший.:)
Ответ 8
Я использовал вышеприведенный ответ, чтобы использовать Zlib:: Deflate
Я продолжал получать разбитые файлы (для небольших файлов), и потребовалось много часов, чтобы выяснить, что проблему можно устранить, используя:
buf = zstream.deflate(string,Zlib::FINISH)
без строки zstream.finish!
def self.deflate(string)
zstream = Zlib::Deflate.new
buf = zstream.deflate(string,Zlib::FINISH)
zstream.close
buf
end
Ответ 9
Чтобы уничтожить содержимое, используйте следующий код (проверенный на 1.9.2)
Zlib::GzipReader.new(StringIO.new(content), :external_encoding => content.encoding).read
Остерегайтесь проблем с кодированием