【问题标题】:Use zlib inflate() in c++ to decompress via PHP ZLIB_ENCODING_RAW encoded datac++中使用zlib inflate()通过PHP ZLIB_ENCODING_RAW编码数据解压
【发布时间】:2021-02-19 04:42:03
【问题描述】:

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

这里的例子(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 文档中我认为不是:

deflate 压缩方法(此方法中唯一支持的 版本)。

#define Z_DEFLATED 8

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

【问题讨论】:

    标签: php c++ c zlib


    【解决方案1】:

    PHP 名称(像往常一样)令人困惑。我将假设ZLIB_ENCODING_RAW 表示原始放气数据(根据 RFC 1951),并且看起来ZLIB_ENCODING_DEFLATE 实际上表示 zlib 包装的放气数据(根据 RFC 1950)。

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

    您可以使用 zlib 库解码原始 deflate 数据,方法是使用 inflateInit2() 而不是 inflateInit(),并将 -15 作为第二个参数。

    【讨论】:

    • 谢谢你,这很好用。 (via PHP) RAW 压缩数据与DEFLATE 压缩数据基本相同,只是它在开头丢失了 2 个字节,在结尾丢失了 4 个字节,最后两个字节(在 4 个字节之前) -tail) 也不同。
    • 您对定义应该如何命名的“假设”重新指定和建议是正确的。 PHP 的 RAW 确实是没有标头和 CRC 的“原始”DEFLATE,而 PHP 的 DEFLATE 确实是 ZLIB 变体(标头和 crc)。
    • PS 忽略我关于 2 个字节不同的评论(这是一个错误的观察)
    猜你喜欢
    • 2013-11-30
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多