|
Posted by cobbletang on July 24, 2006, 2:05 pm
Please log in for more thread options
Paul Marquess wrote:
> > Hi all,
> >
> > I gave myself a headache trying to figure this one out. Any help would
> > be much appreciated. Just trying to understand how the Compress
> > module's inflate and deflate functions work. My understanding is
> > calling deflate on an input stream (a string for example) will compress
> > the stream resulting in a binary representation, and then calling
> > inflate on that same stream should restore the original stream.
> >
> > To test this theory I tried to follow the examples in the docs.
> > Deflate seems to work properly, converting my test string into a
> > unintelligble stream of binary data. When I try to inflate the stream
> > back, I get error message -3 and the zlib msg() returns 'unknown
> > compression method'.
> >
> > Using activestate perl on windows XP.
> >
> > code as follows:
> >
> > use strict;
> > use Compress::Zlib;
> >
> > my ($out, $status, $nout);
> > my $x = deflateInit() or die "Cannot init deflation stream\n";
> >
> > my $testStream = "Cannot init deflation stream\n";
> > ($out,$status) = $x->deflate($testStream);
> >
> > $status == Z_OK or die "deflation failed\n";
> > ($out, $status) = $x->flush();
>
> You are overwriting $out in the flush call. Try this instead
>
> ($out1, $status) = $x->flush();
> $out .= $out1 ;
>
>
> > $status == Z_OK or die "deflation failed\n";
> > print "[$out]\n";
> >
> > my ($y, $status) = inflateInit() or die "Cannot init inflation
> > stream\n";
> > if ($y == undef) {print "inflateInit failed with error code:
> > $status\n";}
> >
> > ($nout, $status) = $y->inflate($out);
> > if ($nout == undef) {print "Error inflating: errnum: $status\n";}
> >
> > print "bytes in: " . $y->total_in() . " [$nout]\n";
> > $status == Z_OK or die "inflation failed: ". $y->msg() . "\n";
> >
>
>
> Paul
Thanks Paul,
That did the trick. I fixed the expressions with undef in them as
well. Here is working code.
use strict;
use Compress::Zlib;
#------ deflate -------
my ($out, $out1, $status, $nout);
my $x = deflateInit() or die "this text has been deflated/inflated";
my $testStream = "deflate this text please";
($out,$status) = $x->deflate($testStream);
$status == Z_OK or die "deflation failed\n";
($out1, $status) = $x->flush();
$out .= $out1;
$status == Z_OK or die "deflation failed\n";
print "deflated output: [$out]\n";
#------ inflate -------
my ($y, $status) = inflateInit() or die "Cannot init inflation
stream\n";
if (!defined($y)) {print "inflateInit failed with error code:
$status\n";}
($nout, $status) = $y->inflate($out);
if (!defined($nout)) {print "Error inflating: errnum: $status\n";}
print "inflated output: [$nout]\n";
$status == Z_OK or $status == Z_STREAM_END or die "inflation failed: ".
$y->msg() . "\n";
_________
output:
deflated output: [non-ascii characters]
inflated output: [this text has been deflated/inflated]
Thanks again Paul!
JJ
|