在c++中使用zlib inflate()解压PHP ZLIB_ENCODING_RAW编码数据

Use zlib inflate() in c++ to decompress via PHP ZLIB_ENCODING_RAW encoded data

当我用 ZLIB_ENCODING_DEFLATE 编码压缩 PHP 中的字符串并输出十六进制数据时,我可以使用 zlib deflate() 将其转换回原始字符串一个 C++ 项目。

根据此处的示例 (https://www.php.net/manual/en/function.zlib-encode.php):

<?php
$str = 'hello world';
$enc = zlib_encode($str, ZLIB_ENCODING_DEFLATE);
echo bin2hex($enc);
?>

在c++中,先将十六进制字符串转换为二进制数据后:(简化代码)

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);

OutBuffer 再次包含“hello world”

我想知道 zlib inflate() 是否也解压缩了通过 PHP 生成的 zlib_encode($str, ZLIB_ENCODING_RAW); 原始数据?

从 zlib 文档我认为不是:

The deflate compression method (the only one supported in this version).

#define Z_DEFLATED 8

但是PHP的函数名zlib_encode()和定义ZLIB_ENCODING_RAW似乎暗示zlib支持它?如果是这样,我使用什么函数 and/or 参数?

PHP 名称(像往常一样)令人困惑。我将假设 ZLIB_ENCODING_RAW 表示原始压缩数据(根据 RFC 1951),看起来 ZLIB_ENCODING_DEFLATE 实际上表示 zlib-wrapped 压缩数据(根据 RFC 1950)。

如果那是正确的,他们应该分别称他们为 ZLIB_ENCODING_DEFLATEZLIB_ENCODING_ZLIB。但是我跑题了。

您可以通过使用 inflateInit2() 而不是 inflateInit() 并将 -15 作为第二个参数来使用 zlib 库解码原始压缩数据。