みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

gzファイルを作ってみるテスト

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

gzファイルを作ってみるテスト

投稿記事 by みけCAT » 11年前

cgiでLinux向けのアーカイブを出力するとき、.tar.gz形式なら何も考えずに

CODE:

$ tar xvzf hoge.tar.gz
という定型コマンドで解凍できて便利だね!(個人の感想です)
すでにtarのデータをを出力するプログラムは書いてあるので、あとはgzに変換するプログラムを書けば勝利だね!

ということで、適当に調べて書いてみました。
参考資料
GZIP file format specification version 4.3
DEFLATE Compressed Data Format Specification version 1.3

書いたソースコード

CODE:

#!/usr/bin/perl

use strict;

my $inputFileName;
my $outputFileName;

if(@ARGV2) {
	die "Usage: file2gz.pl  [output file]\n";
} elsif(@ARGV $outputFileName")) {
	close(IN);
	die "Output file open error.\n";
}

binmode(IN);
binmode(OUT);

my ($mtime) = (stat(IN))[9];

print OUT "\x1f\x8b\x08\x00";
print OUT pack("C4",$mtime&0xFF,($mtime>>8)&0xFF,($mtime>>16)&0xFF,($mtime>>24)&0xFF);
print OUT "\x00\x00";

my @crc32table=();
&crc32maketable;
my $crc32=0xFFFFFFFF;
my $size=0;

if((-s IN)>0) {
	my $nowsize;
	my $data;
	my $datatoout="";

	while($nowsize=read(IN,$data,0xFFFF)) {
		if($datatoout ne "") {
			print OUT "\x00";
			print OUT $datatoout;
		}

		$size=($size+$nowsize)&0xFFFFFFFF;
		$datatoout=pack("C2",$nowsize&0xFF,($nowsize>>8)&0xFF);
		$datatoout.=pack("C2",(~$nowsize)&0xFF,((~$nowsize)>>8)&0xFF);
		$datatoout.=$data;
		$crc32=&crc32update($crc32,$data);
	}

	if($datatoout ne "") {
		print OUT "\x01";
		print OUT $datatoout;
	}
} else {
	print OUT "\x01\x00\x00\xFF\xFF";
}

print OUT pack("C4",(~$crc32)&0xFF,((~$crc32)>>8)&0xFF,
	((~$crc32)>>16)&0xFF,((~$crc32)>>24)&0xFF);
print OUT pack("C4",$size&0xFF,($size>>8)&0xFF,($size>>16)&0xFF,($size>>24)&0xFF);

close(IN);
close(OUT);

sub crc32maketable {
	for(my $n=0;$n>1)&0x7FFFFFFF);
			} else {
				$c=($c>>1)&0x7FFFFFFF;
			}
			$crc32table[$n]=$c;
		}
	}
}

sub crc32update {
	my ($crc,$data)=@_;
	my $len=length($data);
	for(my $i=0;$i>8)&0x00FFFFFF);
	}
	return $crc;
}
このコードをfile2gz.plとして保存すると、

CODE:

$ file2gz.pl hoge.txt
というコマンドで、カレントディレクトリにhoge.txt.gzが出力される仕様です。
また、

CODE:

$ file2gz.pl hoge.txt exsample.txt.gz
というように、出力ファイルの名前を指定することができます。

次はzipファイルを生成したいな。

コメントはまだありません。