Compress::Zlib unable to inflate

Compress::Zlib unable to inflate

am 24.07.2006 09:52:03 von cobbletang

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 = "deflate this text please\n";
($out,$status) = $x->deflate($testStream);

$status == Z_OK or die "deflation failed\n";
($out, $status) = $x->flush();

$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";

----------------
output is:


Error inflating: errnum: -3
bytes in: 1 []
inflation failed: unknown compression method

I'm at a loss. Any help would be greatly appreciated. Thanks.

JJ

Re: Compress::Zlib unable to inflate

am 24.07.2006 10:01:10 von Paul Marquess

wrote in message
news:1153727523.833481.109300@75g2000cwc.googlegroups.com...
> 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 = "deflate this text please\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

Re: Compress::Zlib unable to inflate

am 24.07.2006 20:05:01 von cobbletang

Paul Marquess wrote:
> wrote in message
> news:1153727523.833481.109300@75g2000cwc.googlegroups.com...
> > 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