web-dev-qa-db-ja.com

RubyでGzip文字列を解凍するにはどうすればよいですか?

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

文字列を解凍するにはどうすればよいですか?

47
Fluffy

上記の方法は私にはうまくいきませんでした。
incorrect header check (Zlib::DataError)エラーが発生し続けました。どうやらデフォルトでヘッダーがあると想定されているようですが、常にそうであるとは限りません。

私が実装した回避策は次のとおりです。

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

デフォルトでは、Zlibは圧縮データにヘッダーが含まれていると想定しています。データにヘッダーが含まれていない場合、Zlib :: DataErrorが発生して失敗します。

次の回避策を使用して、データにヘッダーがないと仮定するようにZlibに指示できます。

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

文字列の解凍には Zlib :: Inflate が必要で、圧縮にはZlib :: Deflateが必要です

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

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

7
BearPy

Railsで使用できます:

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

(-Zlib::MAX_WBITS)を使用して、ERROR: invalid code lengths setERROR: invalid block typeを取得しました
[。

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

最近、追加のパラメーターは必要ありません。 deflateおよびinflateクラスメソッドがあり、次のようなクイックワンライナーを使用できます。

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

「文字列を解凍する方法は?」という質問に答えていると思います。最高の。 :)

3
Alex Fortuna

コンテンツをgunzipするには、次のコードを使用します(1.9.2でテスト済み)

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

エンコードの問題に注意してください

3
pinguin666

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
2
Abdo