在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_DEFLATE
和 ZLIB_ENCODING_ZLIB
。但是我跑题了。
您可以通过使用 inflateInit2()
而不是 inflateInit()
并将 -15
作为第二个参数来使用 zlib 库解码原始压缩数据。
当我用 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_DEFLATE
和 ZLIB_ENCODING_ZLIB
。但是我跑题了。
您可以通过使用 inflateInit2()
而不是 inflateInit()
并将 -15
作为第二个参数来使用 zlib 库解码原始压缩数据。