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 に答える
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 に答える
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

最近は追加のパラメータは必要ありません。次のような迅速なワンライナーを可能にするクラスメソッドがあります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 に答える
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 に答える