53

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

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

4

9 回答 9

124

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

我实施的解决方法是:

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read
于 2009-09-02T06:59:02.453 回答
19

Zlib 默认假定您的压缩数据包含标头。如果您的数据不包含标头,它将通过引发 Zlib::DataError 失败。

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

def inflate(string)
  zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end
于 2009-11-15T19:03:50.790 回答
16

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

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end
于 2009-09-01T11:30:04.113 回答
14

在 Rails 中,您可以使用:

  • ActiveSupport::Gzip.compress("my string")
  • ActiveSupport::Gzip.decompress().
于 2015-11-12T21:10:00.803 回答
7

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

于 2014-01-16T05:09:48.927 回答
5

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

Zlib::GzipReader.new(StringIO.new(response_body)).read
于 2009-12-26T04:34:11.547 回答
3

我使用上面的答案来使用 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
于 2011-03-30T20:15:44.373 回答
3

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

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

谨防编码问题

于 2011-10-18T09:28:08.733 回答
3

这些天我们不需要任何额外的参数。有一些deflateinflate方法允许像这样的快速单行器:

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

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

于 2012-09-18T09:59:43.470 回答