如何在ruby中解压缩Gzip字符串?

Flu*_*ffy 47 ruby gzip zlib

Zlib :: GzipReader可以采用"IO或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
Run Code Online (Sandbox Code Playgroud)

我应该如何解开字符串?

Gar*_*rth 114

上述方法对我不起作用.
我一直在收到incorrect header check (Zlib::DataError)错误.显然它假设你默认有一个标题,但情况可能并非总是如此.

我实施的工作是:

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我得到了同样的错误,这解决了我的问题! (3认同)

小智 18

Zlib默认情况下假设压缩数据包含标题.如果您的数据不包含标题,则会通过引发Zlib :: DataError而失败.

您可以通过以下解决方法告诉Zlib假设数据没有标头:

def inflate(string)
  zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end
Run Code Online (Sandbox Code Playgroud)


dim*_*mus 15

你需要Zlib :: Inflate来解压缩字符串和Zlib :: Deflate来进行压缩

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end
Run Code Online (Sandbox Code Playgroud)


小智 7

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

  • 好一个.从[docs](http://www.ruby-doc.org/stdlib-2.1.5/libdoc/zlib/rdoc/Zlib/Inflate.html)"或添加16只解码gzip格式(Zlib: :将为非gzip流引发DataError)" (2认同)

Tyl*_*ler 6

在Rails中,您可以使用:

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


小智 5

使用(-Zlib::MAX_WBITS),我ERROR: invalid code lengths setERROR: invalid block type
我的唯一以下工作了.

Zlib::GzipReader.new(StringIO.new(response_body)).read
Run Code Online (Sandbox Code Playgroud)