Perl中的Deflate在PHP中失败

Perl中的Deflate在PHP中失败,php,perl,Php,Perl,我正在做一个Perl脚本,以便在Perl中执行deflate,这样我就可以在PHP中进行测试,Perl的结果很好,但是当我尝试时 在PHP中,生成的代码在第3行的C:\xampp\htdocs\test.PHP中收到错误警告:gzinflate:data error 来源 use MIME::Base64; use Compress::Zlib; my $php_code = "<?php echo 'hi world'; ?>"; #FAIL #my $php_code = "

我正在做一个Perl脚本,以便在Perl中执行deflate,这样我就可以在PHP中进行测试,Perl的结果很好,但是当我尝试时 在PHP中,生成的代码在第3行的C:\xampp\htdocs\test.PHP中收到错误警告:gzinflate:data error

来源

use MIME::Base64;
use Compress::Zlib;

my $php_code  = "<?php echo 'hi world'; ?>"; #FAIL
#my $php_code = "echo 'hi world';"; FAIL

print "Original : ".$php_code."\n\n";

my $buffer;
my $d = deflateInit();

$buffer  = $d->deflate($php_code);
$buffer .= $d->flush();

print "After Encoded Base64 : ".$buffer."\n\n"; #

my $encoded = encode_base64($buffer,"");

print "Encoded : ".$encoded."\n\n";

$encoded = decode_base64($encoded);

#

print "After Decoded Base64 : ".$encoded."\n\n"; #

my $decoded;
my $i = inflateInit();

while ($encoded) {
    $decoded .= $i->inflate($encoded);
}

print "Decoded : ".$decoded."\n\n";
我尝试删除标记,但相同的错误仍在继续


如何修复此错误?

如果您阅读了该模块的手册,就会发现您错误地使用了它。deflate操作的结果是flush的输出,您不应该将其附加到deflate的输出中

这个程序的结果在PHP中运行良好,但请注意,您不能进行求值,因为它不需要对代码进行修改

Perl 严格使用; 使用“全部”警告; 使用MIME::Base64; 使用Compress::Zlib; 我的$php_代码=; 打印原件:$php\u代码\n\n; my$d=deflateInit; $d->deflate$php\u代码; my$buffer=$d->flush; my$encoded=encode_base64$buffer; 在编码Base64之后打印:$Encoded\n\n; 输出 原件: 编码后的Base64:s7evychqse3oyfdqz8hukm8vyklrt1awtwmaaqh4g== PHP 输出 $decoded: 必须保留从deflate和flush方法返回的数据

在这个特定的实例中,忽略从deflate返回的数据恰好起作用,因为输入很小。如果在deflate中放入一个更大的缓冲区,而忽略它返回的内容,那么最终将得到一个损坏的数据流

这里有一点背景-默认情况下,将创建一个兼容的压缩数据流。查看gzinflate的定义,该方法似乎需要一个兼容的数据流

当从flush返回的数据被忽略时,测试代码能够正常工作的原因是数据流只是一个具有两个字节头和四个字节尾的数据流

下面对deflate的第一个调用将只返回两个字节的头,因为$php_代码只包含几个字节的数据

$buffer  = $d->deflate($php_code);
这意味着,通过忽略从deflate返回的数据,您将得到一个具有来自的尾部的数据流。php GZFLATE方法似乎可以解决这个问题

如果输入数据较长,它将返回两字节头和一些压缩数据

要创建正确的数据流,请使用以下命令

my $d = deflateInit(-WindowBits => MAX_WBITS) ;
$buffer  = $d->deflate($php_code);
$buffer .= $d->flush();

这项工作:打印htmlentitiesgzinflatebase64_decodebase64_encodegzdeflate;错误mst在其他地方。如果你能阅读它,你会发现:但是你需要另一种方法。很好,谢谢你的帮助,你是一个英雄博罗丁xD。
Warning: gzinflate(): data error in C:\xampp\htdocs\test.php on line 3
$buffer  = $d->deflate($php_code);
my $d = deflateInit(-WindowBits => MAX_WBITS) ;
$buffer  = $d->deflate($php_code);
$buffer .= $d->flush();