Perlでのgzipの圧縮・展開

Perlでのgzipの圧縮・展開

圧縮

既に変数に入っているデータを圧縮する時は、

 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 の関数が使えます。

See also

[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)