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
文字列を解凍するにはどうすればよいですか?
上記の方法は私にはうまくいきませんでした。incorrect header check (Zlib::DataError)
エラーが発生し続けました。どうやらデフォルトでヘッダーがあると想定されているようですが、常にそうであるとは限りません。
私が実装した回避策は次のとおりです。
require 'zlib'
require 'stringio'
gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s))
uncompressed_string = gz.read
デフォルトでは、Zlibは圧縮データにヘッダーが含まれていると想定しています。データにヘッダーが含まれていない場合、Zlib :: DataErrorが発生して失敗します。
次の回避策を使用して、データにヘッダーがないと仮定するようにZlibに指示できます。
def inflate(string)
zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
文字列の解凍には Zlib :: Inflate が必要で、圧縮にはZlib :: Deflateが必要です
def inflate(string)
zstream = Zlib::Inflate.new
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
zstream = Zlib :: Inflate.new(16 + Zlib :: MAX_WBITS)
Railsで使用できます:
ActiveSupport::Gzip.compress("my string")
ActiveSupport::Gzip.decompress()
。(-Zlib::MAX_WBITS)
を使用して、ERROR: invalid code lengths set
とERROR: invalid block type
を取得しました
[。
Zlib::GzipReader.new(StringIO.new(response_body)).read
最近、追加のパラメーターは必要ありません。 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!"
「文字列を解凍する方法は?」という質問に答えていると思います。最高の。 :)
コンテンツをgunzipするには、次のコードを使用します(1.9.2でテスト済み)
Zlib::GzipReader.new(StringIO.new(content), :external_encoding => content.encoding).read
エンコードの問題に注意してください
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