El problema es que estamos trabajando con
flujos (
streams), no con sistemas que manejen bloques enteros de información.
Quiero decir que, cuando le pides que comprima algo, te devolverá
el comienzo del flujo comprimido, esperando que le des más información para comprimir (porque se trata de un flujo).
Entonces, lo que hay que hacer es indicarle que el flujo de entrada terminó (no queremos comprimir más) y que cierre el flujo de salida comprimida, entregándonos todo lo que resta.
Y esto mismo hay que hacerlo en la descompresión: abrimos el flujo y vamos leyendo hasta que Zlib no nos pueda entregar más.
Además, tienes un error en la línea 15: no puedes aplicar primero decode_base64 a lo que
todavía está comprimido. Tienes que hacer las operaciones de descompresión en el orden inverso en que las hiciste en la compresión.
El siguiente ejemplo está basado en el tuyo, pero más detallado, para que se entienda el proceso:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
use strict;
use warnings;
use diagnostics;
use MIME::Base64;
use Compress::Zlib;
my $bufer;
my $status;
my $php_code = "<?php echo 'hola mundo'; ?>";
say "PHP Code : [$php_code] Longitud: ", length $php_code;
my $php_bs64 = encode_base64($php_code, '');
say "Base 64 : [$php_bs64] Longitud: ", length $php_bs64;
# Compresión ---------------------------------------------------------------
my $d;
my $encoded;
($d, $status) = deflateInit();
die "ERROR al crear el motor de inflacción: [$status]\n" if not defined $d;
($encoded, $status) = $d->deflate($php_bs64);
die "ERROR al comprimir. Error [$status]\n" if not defined $encoded;
$bufer = $encoded; # almacenar
# Limpiar
($encoded, $status) = $d->flush(); # limpiar búfer
die "ERROR al comprimir. Error [$status]\n" if not defined $encoded;
$bufer .= $encoded; # agregar fin de compresión
say "Longitud encoded: ", length $bufer; # resultado
# Descompresión ------------------------------------------------------------
my $i;
my $decoded;
($i, $status) = inflateInit();
die "ERROR al crear el motor de inflacción: [$status]\n" if not defined $i;
$php_bs64 = ''; # búfer de la salida
while ($bufer) {
($decoded, $status) = $i->inflate($bufer);
die "ERROR al descomprimir. Error [$status]\n" if not defined $decoded;
$php_bs64 .= $decoded; # acumulamos
}
say "Base 64 : [$php_bs64] Longitud: ", length $php_bs64;
$php_code = decode_base64($php_bs64);
say "PHP Code : [$php_code] Longitud: ", length $php_code;
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
A la hora de comprimir, hacemos dos llamadas: deflate() y flush(). La llamada a flush() es necesaria para que nos entregue el resto del flujo que quedaba por comprimir. Lo agregamos todo a $bufer. Y después, a la hora de descomprimir, hacemos un bucle while() mientras $bufer va siendo descomprimido por inflate(), que lo va modificando. El resultado es:
Using text Syntax Highlighting
PHP Code : [<?php echo 'hola mundo'; ?>] Longitud: 27
Base 64 : [PD9waHAgZWNobyAnaG9sYSBtdW5kbyc7ID8+] Longitud: 36
Longitud encoded: 44
Base 64 : [PD9waHAgZWNobyAnaG9sYSBtdW5kbyc7ID8+] Longitud: 36
PHP Code : [<?php echo 'hola mundo'; ?>] Longitud: 27
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Esta es la versión mínima, sin controles de fallos:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
use MIME::Base64;
use Compress::Zlib;
my $php_code = "<?php echo 'hola mundo'; ?>";
say "PHP Code : [$php_code]";
my $php_bs64 = encode_base64($php_code, '');
# Compresión ---------------------------------------------------------------
my $bufer;
my $d = deflateInit();
$bufer = $d->deflate($php_bs64);
$bufer .= $d->flush();
# Descompresión ------------------------------------------------------------
my $bs64;
my $i = inflateInit();
while ($bufer) {
$bs64 .= $i->inflate($bufer);
}
$php_code = decode_base64($bs64);
say "PHP Code : [$php_code]";
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4