1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
use strict;
use warnings;
use File::Path;
use File::Basename;
use IO::File;
use IO::Uncompress::RawInflate qw(:all);
die "Usage: zipcat file\n"
if @ARGV != 1 ;
my $file = $ARGV[0] ;
my $fh = new IO::File "<$file"
or die "Cannot open '$file': $!\n";
while ()
{
my $FIXED_HEADER_LENGTH = 30 ;
my $sig;
my $buffer;
my $x ;
($x = $fh->read($buffer, $FIXED_HEADER_LENGTH)) == $FIXED_HEADER_LENGTH
or die "Truncated file top: $x $!\n";
my $signature = unpack ("V", substr($buffer, 0, 4));
last unless $signature == 0x04034b50;
my $compressedMethod = unpack ("v", substr($buffer, 8, 2));
my $compressedLength = unpack ("V", substr($buffer, 18, 4));
#my $uncompressedLength = unpack ("V", substr($buffer, 22, 4));
my $filename_length = unpack ("v", substr($buffer, 26, 2));
my $extra_length = unpack ("v", substr($buffer, 28, 2));
warn "Compressed Length $compressedLength\n";
my $filename ;
$fh->read($filename, $filename_length) == $filename_length
or die "Truncated file\n";
$fh->read($buffer, $extra_length) == $extra_length
or die "Truncated file\n";
if ($compressedMethod != 8 && $compressedMethod != 0)
{
warn "Skipping file '$filename' - not deflated $compressedMethod\n";
$fh->read($buffer, $compressedLength) == $compressedLength
or die "Truncated file\n";
next;
}
next if $compressedLength == 0;
warn "Writing file '$filename' $compressedMethod\n";
#mkpath dirname $filename;
#rawinflate $fh => $filename,
rawinflate $fh => '-',
Transparent => 1,
InputLength => $compressedLength
or die "Error uncompressing $file [$filename]: $RawInflateError\n" ;
}
sub decodeLocalFileHeader
{
my $buffer = shift ;
}
|