Home > Archive > PERL Modules > July 2006 > Compress::Zlib unable to inflate
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
Compress::Zlib unable to inflate
|
|
| cobbletang@gmail.com 2006-07-24, 3:56 am |
| 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:
<string of binary characters>
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
| |
| Paul Marquess 2006-07-24, 3:56 am |
|
<cobbletang@gmail.com> 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
| |
| cobbletang@gmail.com 2006-07-24, 6:56 pm |
| Paul Marquess wrote:
> <cobbletang@gmail.com> wrote in message
> news:1153727523.833481.109300@75g2000cwc.googlegroups.com...
>
> You are overwriting $out in the flush call. Try this instead
>
> ($out1, $status) = $x->flush();
> $out .= $out1 ;
>
>
>
>
> 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
|
|
|
|
|