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

Zlib :: GzipReader可以接受“一个IO或类似IO的对象”。 作为输入,如docs中所述。

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

我应该如何将字符串解压缩?

Fluffy asked 2020-02-19T04:03:01Z
9个解决方案
113 votes

上面的方法对我不起作用。
我一直收到incorrect header check (Zlib::DataError)错误。 显然,它假定默认情况下具有标题,但情况并非总是如此。

我实施的工作是:

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read
Garth answered 2020-02-19T04:03:24Z
18 votes

默认情况下,Zlib假定您的压缩数据包含标头。如果您的数据不包含标题,则将引发Zlib :: Data错误而失败。

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

def inflate(string)
  zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end
answered 2020-02-19T04:03:48Z
15 votes

您需要Zlib :: Inflate来解压缩字符串,并需要Zlib :: Deflate来进行压缩。

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end
dimus answered 2020-02-19T04:04:08Z
7 votes

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

BearPy answered 2020-02-19T04:04:28Z
6 votes

在Rails中,您可以使用:

  • ActiveSupport::Gzip.decompress()
  • ActiveSupport::Gzip.decompress()
Tyler answered 2020-02-19T04:04:57Z
5 votes

使用(-Zlib::MAX_WBITS),我得到ERROR: invalid code lengths setERROR: invalid block type
以下唯一对我有用的东西。

Zlib::GzipReader.new(StringIO.new(response_body)).read
john answered 2020-02-19T04:05:22Z
3 votes

要压缩内容,请使用以下代码(在1.9.2中进行测试)

Zlib::GzipReader.new(StringIO.new(content), :external_encoding => content.encoding).read

当心编码问题

pinguin666 answered 2020-02-19T04:05:47Z
3 votes

这些天,我们不需要任何额外的参数。 有deflateinflate类方法,这些方法可以实现如下所示的快速oneliner:

>> 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!"

我认为它回答了“我应该如何为字符串解压缩”的问题。 最好的。 :)

Alex Fortuna answered 2020-02-19T04:06:12Z
2 votes

我使用上面的答案来使用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
Abdo answered 2020-02-19T04:06:42Z
translate from https://stackoverflow.com:/questions/1361892/how-to-decompress-gzip-string-in-ruby