• Publicidad

deflate en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

deflate en Perl

Notapor BigBear » 2017-03-01 17:45 @781

Hola. Estoy tratando de hacer lo mismo que hace la función gzdeflate en PHP pero en Perl. El problema es que no puedo hacerlo porque no encuentro documentación al respecto.

El código en PHP que hace lo que quiero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. $string  = ' echo \'<p>Hello World</p>\'; ?> ';
  2. $encoded = base64_encode(gzdeflate($string));
Coloreado en 0.020 segundos, usando GeSHi 1.0.8.4

Conseguí cómo hacer lo opuesto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use MIME::Base64;
  2. use Compress::Zlib;
  3.  
  4. my ($i, $istatus) = inflateInit( -WindowBits => -MAX_WBITS);
  5. my ($decoded, $ostatus) = $i->inflate(decode_base64($code));
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

pero no cómo codificar una cadena con código PHP en gzdeflate en Perl. ¿Se puede hacer en Perl?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: deflate en Perl

Notapor explorer » 2017-03-01 18:15 @802

Lo tienes en el mismo módulo Compress::Zlib, en la parte de deflate:

https://metacpan.org/pod/Compress::Zlib ... -Interface

Hay más distribuciones para deflate: https://metacpan.org/search?q=deflate
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: deflate en Perl

Notapor BigBear » 2017-03-04 10:28 @478

Hola, explorer, gracias por responder. Tengo un problema con el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use MIME::Base64;
  2. use Compress::Zlib;
  3.  
  4. my $php_code = "<?php echo 'hola mundo'; ?>";
  5.  
  6. print "PHP Code : ".$php_code."\n\n";
  7.  
  8. my ($i, $istatus) = deflateInit( -WindowBits => -MAX_WBITS);
  9. my ($encoded, $ostatus) = $i->deflate(encode_base64($php_code));
  10.  
  11. print "Encoded : ".$encoded."\n";
  12. print "Status : ".$istatus."\n\n";
  13.  
  14. my ($i, $istatus) = inflateInit( -WindowBits => -MAX_WBITS);
  15. my ($decoded, $ostatus) = $i->inflate(decode_base64($encoded));
  16.  
  17. print "Decoded : ".$decoded."\n";
  18. print "Status : ".$istatus."\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Devuelve :

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
PHP Code : <?php echo 'hola mundo'; ?>

Encoded :
Status :

Decoded :
Status :
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Creo que lo hice bien, no sé por qué devuelve todo vacío, ni el status puedo ver :evil:

¿ Qué hice mal esta vez ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: deflate en Perl

Notapor explorer » 2017-03-04 11:53 @537

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6. use MIME::Base64;
  7. use Compress::Zlib;
  8.  
  9. my $bufer;
  10. my $status;
  11.  
  12. my $php_code = "<?php echo 'hola mundo'; ?>";
  13. say "PHP Code : [$php_code] Longitud: ", length $php_code;
  14.  
  15. my $php_bs64 = encode_base64($php_code, '');
  16. say "Base 64  : [$php_bs64] Longitud: ", length $php_bs64;
  17.  
  18. # Compresión ---------------------------------------------------------------
  19. my $d;
  20. my $encoded;
  21.  
  22. ($d, $status) = deflateInit();
  23. die "ERROR al crear el motor de inflacción: [$status]\n" if not defined $d;
  24.  
  25. ($encoded, $status) = $d->deflate($php_bs64);
  26. die "ERROR al comprimir. Error [$status]\n" if not defined $encoded;
  27. $bufer = $encoded;                              # almacenar
  28.  
  29. # Limpiar
  30. ($encoded, $status) = $d->flush();              # limpiar búfer
  31. die "ERROR al comprimir. Error [$status]\n" if not defined $encoded;
  32. $bufer .= $encoded;                             # agregar fin de compresión
  33.  
  34. say "Longitud encoded: ", length $bufer;        # resultado
  35.  
  36.  
  37. # Descompresión ------------------------------------------------------------
  38. my $i;
  39. my $decoded;
  40.  
  41. ($i, $status) = inflateInit();
  42. die "ERROR al crear el motor de inflacción: [$status]\n" if not defined $i;
  43.  
  44. $php_bs64 = '';                                 # búfer de la salida
  45.  
  46. while ($bufer) {
  47.     ($decoded, $status) = $i->inflate($bufer);
  48.     die "ERROR al descomprimir. Error [$status]\n" if not defined $decoded;
  49.     $php_bs64 .= $decoded;                      # acumulamos
  50. }
  51.  
  52. say "Base 64  : [$php_bs64] Longitud: ", length $php_bs64;
  53.  
  54. $php_code = decode_base64($php_bs64);
  55.  
  56. say "PHP Code : [$php_code] Longitud: ", length $php_code;
Coloreado en 0.002 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:
Sintáxis: [ Descargar ] [ Ocultar ]
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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use MIME::Base64;
  4. use Compress::Zlib;
  5.  
  6.  
  7. my $php_code = "<?php echo 'hola mundo'; ?>";
  8. say "PHP Code : [$php_code]";
  9. my $php_bs64 = encode_base64($php_code, '');
  10.  
  11.  
  12. # Compresión ---------------------------------------------------------------
  13. my $bufer;
  14. my $d = deflateInit();
  15.  
  16. $bufer  = $d->deflate($php_bs64);
  17. $bufer .= $d->flush();
  18.  
  19.  
  20. # Descompresión ------------------------------------------------------------
  21. my $bs64;
  22. my $i = inflateInit();
  23.  
  24. while ($bufer) {
  25.     $bs64 .= $i->inflate($bufer);
  26. }
  27.  
  28. $php_code = decode_base64($bs64);
  29. say "PHP Code : [$php_code]";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: deflate en Perl

Notapor BigBear » 2017-03-04 19:49 @867

Hola, explorer, gracias por la ayuda y el código. Tengo un último problema: estoy cambiando el código porque cuando se realiza el procedimiento inflate() se hace de otra forma según el código PHP:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php // sample answer by chathurya
  2. /*
  3. $string  = '<?php echo \'<p>Hello World</p>\'; ?> ';
  4. */
  5.  
  6. $string  = ' echo \'<p>Hello World</p>\'; ?> ';
  7. $encoded = base64_encode(str_rot13(gzdeflate($string)));
  8. $uncompressed = gzinflate(str_rot13(base64_decode($encoded)));
  9.  
  10. eval($uncompressed);
  11. ?>
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

Perdón por no mostrar el código completo, no me di cuenta, primero se realiza el deflate y se codifica el resultado a base64 y después cuando se decodifica el código del deflate que está en base64 y se realiza el procedimiento inflate.

Mi código casi terminado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use MIME::Base64;
  2. use Compress::Zlib;
  3.  
  4. my $php_code = "<?php echo 'hola mundo'; ?>";
  5.  
  6. print "Original : ".$php_code."\n\n";
  7.  
  8. my $buffer;
  9. my $d = deflateInit();
  10.  
  11. $buffer  = $d->deflate($php_base64);
  12. $buffer .= $d->flush();
  13.  
  14. print "After Encoded Base64 : ".$buffer."\n\n"; #
  15.  
  16. my $encoded = encode_base64($buffer);
  17.  
  18. print "Encoded : ".$encoded."\n\n";
  19.  
  20. $encoded = decode_base64($encoded);
  21.  
  22. #
  23.  
  24. print "After Decoded Base64 : ".$encoded."\n\n"; #
  25.  
  26. my $decoded;
  27. my $i = inflateInit();
  28.  
  29. while ($encoded) {
  30.     $decoded .= $i->inflate($encoded);
  31. }
  32.  
  33. print "Decoded : ".$decoded."\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Un resultado casi perfecto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
After Encoded Base64 : x£♥    ☺

Encoded : eJwDAAAAAAE=


After Decoded Base64 : x£♥    ☺

Decoded :
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿ Qué me está faltando ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: deflate en Perl

Notapor explorer » 2017-03-05 15:06 @671

Hay un error en el código, en la línea 11. Debes cambiar $php_base64 por $php_code.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: deflate en Perl

Notapor BigBear » 2017-03-05 18:26 @810

Hummm, estar mucho tiempo en la computadora me debe causar ceguera, no entiendo como no vi ese error, será porque todo me parecía que iba bien, gracias por toda la ayuda, explorer.

El resultado salió mal:
Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2.  
  3. $uncompressed = gzinflate(base64_decode("eJyzsS/IKFBITc7IV1DPyM9JVMgtzUvJV7dWsLcDAH3yCLA="));
  4. eval($uncompressed);
  5.  
  6. ?>
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

Devuelve:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Warning: gzinflate(): data error in C:\xampp\htdocs\test.php on line 3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿ Qué pasó esta vez ? Parecía todo perfecto.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: deflate en Perl

Notapor explorer » 2017-03-06 02:59 @166

Pues no lo sé...

Algo que hay que tener en cuenta es que encode_base64() devuelve la cadena convertida a base64, pero con un retorno de carro, añadido al final.

Lo ideal será indicar que no queremos que añada nada. Cambia la línea 16 a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $encoded = encode_base64($buffer, '');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Quizás sea eso.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: deflate en Perl

Notapor BigBear » 2017-03-06 08:50 @410

Intente pero sigue igual, es una desgracia, estaba tan cerca :evil: :evil: :evil:
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: deflate en Perl

Notapor BigBear » 2017-03-06 11:07 @505

El código de la gloria:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use MIME::Base64;
  2. use Compress::Zlib;
  3.  
  4. my $php_code  = "echo 'hi world'; ?>";
  5. #my $php_code = "echo 'hi world';";
  6.  
  7. print "Original : ".$php_code."\n\n";
  8.  
  9. my $d = deflateInit;
  10. $d->deflate($php_code);
  11.  
  12. my $buffer = $d->flush;
  13.  
  14. print "After Encoded Base64 : ".$buffer."\n\n"; #
  15.  
  16. my $encoded = encode_base64($buffer,"");
  17.  
  18. print "Encoded : ".$encoded."\n\n";
  19.  
  20. $encoded = decode_base64($encoded);
  21.  
  22. #
  23.  
  24. print "After Decoded Base64 : ".$encoded."\n\n"; #
  25.  
  26. my ($i, $istatus) = inflateInit( -WindowBits => -MAX_WBITS);
  27. my ($decoded, $ostatus) = $i->inflate($encoded);
  28.  
  29. print "Decoded : ".$decoded."\n\n";
  30.  
  31.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Una pregunta sobre esta línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. inflateInit( -WindowBits => -MAX_WBITS);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿ Funciona solo en Windows o es así el nombre de WindowsBits ? Porque quería que funcionara en todo y cada vez que la quito deja de andar la decodificación (solo quito el atributo WindowsBits, no la línea entera xD).
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados