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

时间:2009-09-01 11:18:22

标签: 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

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

9 个答案:

答案 0 :(得分:112)

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

我实施的工作是:

require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))    
uncompressed_string = gz.read

答案 1 :(得分: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

答案 2 :(得分:15)

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

  def inflate(string)
    zstream = Zlib::Inflate.new
    buf = zstream.inflate(string)
    zstream.finish
    zstream.close
    buf
  end

答案 3 :(得分:6)

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

答案 4 :(得分:6)

在Rails中,您可以使用:

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

答案 5 :(得分:5)

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

Zlib::GzipReader.new(StringIO.new(response_body)).read

答案 6 :(得分:3)

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

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

小心编码问题

答案 7 :(得分:3)

这些天我们不需要任何额外的参数。有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!"

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

答案 8 :(得分:2)

我使用上面的答案来使用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