既に変数に入っているデータを圧縮する時は、
require Compress::Zlib; $compressed_data = Compress::Zlib::memGzip ($original_data);
で OK。
変数にあるデータを展開する手軽な方法がなぜかありません。 (Google で探しても見つからない。)
## Taken from Namazu http://www.namazu.org/, filter/gzip.pl
my $s = $original_data; ## compressed data
my $flags = unpack('C', substr($s, 3, 1));
$s = substr($s, 10);
$s = substr($s, 2) if ($flags & 0x04);
$s =~ s/^[^\0]*\0// if ($flags & 0x08);
$s =~ s/^[^\0]*\0// if ($flags & 0x10);
$s = substr($s, 2) if ($flags & 0x02);
my $zl = Compress::Zlib::inflateInit
(-WindowBits => - Compress::Zlib::MAX_WBITS());
my ($inf, $stat) = $zl->inflate ($s);
if ($stat == Compress::Zlib::Z_OK()
|| $stat == Compress::Zlib::Z_STREAM_END()) {
return $inf;
} else {
die 'Bad compressed data';
}
Namazu から拝借してきたもの (をちょっといじったもの) です。 ちなみに Namazu のライセンスは GNU GPL2 です。
Gzip の外部ファイルからの読み込みなら、 Gompress::Zlib の関数が使えます。
[1]
最近の (といってももう随分前になりますが) Compress::Zlib
には memory 上の gziped data を展開する method が用意されていますから、面倒な code を書く必要は無くなりました。
(名無しさん 2004-05-29 10:31:24 +00:00)
[2] 元のデータ = Compress::Zlib::memGunzip(圧縮したデータ)で戻せます。 (みず 2004-10-29 12:28:02 +00:00)