Php gzdecode()和inflate_add()之间的二进制互操作性

Php gzdecode()和inflate_add()之间的二进制互操作性,php,websocket,zlib,php-7,deflate,Php,Websocket,Zlib,Php 7,Deflate,不久前,我编写了一个小的WebSocket库,发现添加gzip支持非常简单。当时我没有完全意识到deflate_init()/deflate_add()/inflate_init()/inflate_add()函数实际上是PHP7-only,现在我希望能够在PHP5环境下运行我的WebSocket服务器 我的问题是,deflate\u add()生成的输出与下面的测试用例中的gzdeflate()略有不同,相差一个字符 基于deflate\u add()/inflate\u add()的方法在浏

不久前,我编写了一个小的WebSocket库,发现添加gzip支持非常简单。当时我没有完全意识到
deflate_init()
/
deflate_add()
/
inflate_init()
/
inflate_add()
函数实际上是PHP7-only,现在我希望能够在PHP5环境下运行我的WebSocket服务器

我的问题是,
deflate\u add()
生成的输出与下面的测试用例中的
gzdeflate()
略有不同,相差一个字符

基于
deflate\u add()
/
inflate\u add()
的方法在浏览器中非常有效,
因此
gzdeflate()
的输出是不正确的。我猜
gzdeflate()
/
gzflate()
正在使用具有不同底层选项的zlib-可能与流状态相关的东西这导致了一切的崩溃

最后,我想知道我是否能够说服PHP5-era zlib函数输出“正确”的压缩数据


首先,我在PHP7上使用的基于
deflate_init()
/
deflate_add()
的方法:

$data=“ABC”;
$ctx=deflate_init(ZLIB_ENCODING_RAW);
//不幸的是,我找不到带有示例代码的巨大博客文章
//我从中了解到:(,但它包含与
//下面的substr()。我对它眨了眨眼睛,但显然这就是为什么
//完成了。
$deflated=substr(deflate_add($ctx,$data,ZLIB_SYNC_FLUSH),0,-4);
//$deflated现在是“rtr\6\0”
$ictx=充气初始(ZLIB\u编码\u原始);
$data2=充气加成($ictx、$deflated、ZLIB\U NO\U FLUSH);
//$data2现在是“ABC”
如果我使用
gzdeflate()
/
gzflate()
,会发生以下情况:

$data=“ABC”;
$deflated=gzdeflate($data,9,ZLIB_ENCODING_RAW);
//$deflated现在是“str\6\0”
$output=gz充气($deflated);
//$output现在是“ABC”
尝试
gzip充气()

print gzflage(“rtr\6\0”)。“\n”//将爆炸
打印GZFLATE(“str\6\0”)。“\n”;//打印“ABC”

您所说的正确是不正确的,您所说的不正确是正确的

使用
deflate\u add
您故意创建了一个未终止的,即无效的deflate流。为什么,我不知道。(显然,您也不知道,因为这来自一篇您找不到的“巨大博客文章”)这是用<代码> ZLIBYSycCyFLUX 完成的,它完成了当前的紧缩块并追加了一个空的存储块。<代码>子串(,,4)在最后删除了这个空存储块的大部分,留下了一个不完整的无效的充气流,过早地在存储块的中间结束。 另一方面,
gzdeflate
正在创建一个正确终止的deflate流,其中一个deflate块被标记为最后一个块。两个流之间的唯一区别是第一个(最低有效)位,它是标记最后一个块的1

您不会说正确终止的放气流是如何“导致一切崩溃”的。在任何情况下,您都可以通过使用
ZLIB\u FINISH
而不是
ZLIB\u SYNC\u FLUSH
,并放弃
substr
来使用
deflate\u add
生成正确终止的放气流


如果这是您的要求,则无法使用
gzdeflate
生成无效的deflate流。您不能只更改第一位,因为对于较大的字符串,最后一个块可能不是第一个块。

您所调用的正确是不正确的,而您所调用的不正确是正确的

使用
deflate\u add
您故意创建了一个未终止的,即无效的deflate流。为什么,我不知道。(显然,您也不知道,因为这来自一篇您找不到的“巨大博客文章”)这是用<代码> ZLIBYSycCyFLUX 完成的,它完成了当前的紧缩块并追加了一个空的存储块。<代码>子串(,,4)在最后删除了这个空存储块的大部分,留下了一个不完整的无效的充气流,过早地在存储块的中间结束。 另一方面,
gzdeflate
正在创建一个正确终止的deflate流,其中一个deflate块被标记为最后一个块。两个流之间的唯一区别是第一个(最低有效)位,它是标记最后一个块的1

您不会说正确终止的放气流是如何“导致一切崩溃”的。在任何情况下,您都可以通过使用
ZLIB\u FINISH
而不是
ZLIB\u SYNC\u FLUSH
,并放弃
substr
来使用
deflate\u add
生成正确终止的放气流

如果这是您的要求,则无法使用
gzdeflate
生成无效的deflate流。您不能只更改第一位,因为对于较大的字符串,最后一个块可能不是第一个块