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::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)
を使って(-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!"
「文字列を解凍するにはどうすればよいですか?」という質問に答えると思います。最高の。:)
上記の回答を使用して、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