在c+中使用zlib充气()+;通过PHP ZLIB_ENCODING_原始编码数据解压
在压缩代码<代码> php<代码>压缩时,代码为<代码> ZLIbjEnCONDIONIORIGATEATION/COD>并输出十六进制数据,我可以在C++项目中使用<代码> ZLIB < /COD>代码> 根据这里的示例():在c+中使用zlib充气()+;通过PHP ZLIB_ENCODING_原始编码数据解压,php,c++,c,zlib,Php,C++,C,Zlib,在压缩代码 php压缩时,代码为 ZLIbjEnCONDIONIORIGATEATION/COD>并输出十六进制数据,我可以在C++项目中使用 ZLIB < /COD>代码> 根据这里的示例(): exputffer再次包含“hello world” 我想知道zlibinflate()是否也会解压缩通过PHP生成的zlib\u编码($str,zlib\u ENCODING\u RAW)原始数据 从zlib文档中,我认为不是: 放气压缩方法(是本文件中唯一支持的方法 版本) #定义Z_缩小8 但是
exputffer
再次包含“hello world”
我想知道zlib
inflate()
是否也会解压缩通过PHP
生成的zlib\u编码($str,zlib\u ENCODING\u RAW)代码>原始数据
从zlib文档中,我认为不是:
放气压缩方法(是本文件中唯一支持的方法
版本)
#定义Z_缩小8
但是PHP
的函数名zlib\u encode()
和definezlib\u encode\u RAW
似乎暗示zlib
是否支持它?如果是这样,我应该使用什么函数和/或参数?PHP名称(通常)令人困惑。我将假设ZLIB_ENCODING_RAW
表示原始平减数据(根据RFC 1951),并且似乎ZLIB_ENCODING_deflate
实际上表示ZLIB包装的平减数据(根据RFC 1950)
如果这是正确的,他们应该分别调用它们ZLIB\u ENCODING\u DEFLATE
和ZLIB\u ENCODING\u ZLIB
。但我离题了
您可以使用zlib库解码原始放气数据,方法是使用inflateInit2()
而不是inflateInit2()
,并将-15
作为第二个参数。谢谢,这非常有效。(通过PHP
)RAW
压缩数据基本上与DEFLATE
压缩数据相同,只是它在开始时遗漏了2个字节,在结束时遗漏了4个字节,最后两个字节(在4字节尾之前)你的“假设”重新命名,并就定义应该如何命名提出了建议。PHP的RAW
确实是“RAW”DEFLATE,没有标题和CRC,PHP的DEFLATE
确实是ZLIB变体(标题和CRC)。PS忽略我关于两个字节不同的评论(这是一个错误的观察)
<?php
$str = 'hello world';
$enc = zlib_encode($str, ZLIB_ENCODING_DEFLATE);
echo bin2hex($enc);
?>
z_stream d_stream;
d_stream.zalloc = (alloc_func)0 ;
d_stream.zfree = (free_func)0 ;
d_stream.opaque = (voidpf)0
d_stream.next_in = InBuffer ;
d_stream.avail_in = InBufferLen ;
d_stream.next_out = OutBuffer ;
d_stream.avail_out = OutBufferLen ;
int err = inflateInit(&d_stream) ;
while (err == Z_OK)
err = inflate(&d_stream, Z_NO_FLUSH);
err = inflateEnd(&d_stream);