Как распаковать строку Gzip в рубине?

Вы могли попытаться просить, чтобы установленный пользователь Панели запуска добавил их, или если можно кодировать, получить доступ к ответвлению Базара, соответствующему этому коду, и предложить изменение там. Вы, возможно, должны присоединиться к соответствующей группе сначала, но Вы можете предлагать код без состава группы. Кто-то должен будет фиксировать его для Вас, все же.

47
задан Fluffy 22 January 2019 в 08:11
поделиться

4 ответа

Приведенный выше метод не сработал для меня.
Я продолжал получать ошибку неправильной проверки заголовка (Zlib :: DataError) . По-видимому, предполагается, что у вас есть заголовок по умолчанию, что может быть не всегда.

Я реализовал следующую работу:

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read
114
ответ дан 26 November 2019 в 19:11
поделиться

Вам понадобится Zlib :: Inflate для распаковки строки и Zlib :: Deflate для сжатия

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end
15
ответ дан 26 November 2019 в 19:11
поделиться

Zlib по умолчанию предполагает, что ваши сжатые данные содержат заголовок. Если ваши данные НЕ содержат заголовок, произойдет сбой, вызвав Zlib :: DataError.

Вы можете указать Zlib предположить, что данные не имеют заголовка, используя следующий обходной путь:

def inflate(string)
  zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end
18
ответ дан 26 November 2019 в 19:11
поделиться

Используя (-Zlib::MAX_WBITS), я получил ERROR: invalid code lengths set и ERROR: invalid block type
Единственное, что работает и для меня.

Zlib::GzipReader.new(StringIO.new(response_body)).read
5
ответ дан 26 November 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: