Подтвердить что ты не робот

Как распаковать строку 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

Как мне распаковать строку?

4b9b3361

Ответ 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

Остерегайтесь проблем с кодированием