使用zlib在C ++和PHP之间移动压缩字符串

时间:2010-10-28 18:54:51

标签: php c++ compression zlib

我正在开发一个项目,其中运行PHP的Windows Web服务器通过与运行使用C ++编写的应用程序的后端Linux服务器的非常慢的连接进行通信。因为两台机器之间的连接速度很慢,所以我想压缩它们之间的流量。

我已经到了压缩字符串的位置,将其保存到文件,读取文件,并使用Zlib在C ++中解压缩字符串,同样在PHP中。但是,如果我尝试用一​​种语言压缩字符串并在另一种语言中解压缩(就像在现实世界中会发生的那样),我会收到错误,因为压缩数据已经损坏。我还注意到,在C ++中压缩的相同字符串导致与PHP不同的文件,这使我相信Zlib在每种语言上使用不同的压缩算法。

我正在使用双方的默认设置。我用来进行压缩和解压缩的C ++是

compress((Bytef*)compressed, (uLongf*)&compressedLength, (Bytef*)uncompressed, (uLong)uncomressedLength);
uncompress((Bytef*)uncompressed, (uLongf*)&uncomressedLength, (Bytef*)compressed, (uLong)compressedLength);

,而PHP代码是

$compressed = gzcompress($uncompressed);
$uncompressed = gzuncompress($compressed);

为什么这些会产生不同的压缩字符串?这是导致减压问题的原因吗?我该怎么做才能让它发挥作用?另外,我没有承诺Zlib。 Zlib是我最初的研究发现的,但如果有更好的方法可以做到这一点,我全都听见了。

编辑:实际上,经过多一点测试后,似乎C ++正在使用我的初始测试用例,但不是普遍的。我用输入“hellohellohello”尝试了它,并且在解压缩时,它报告了一个Z_DATA_ERROR并将其解压缩为“hello”。我想这意味着我在C ++方面做错了,这可以解释为什么PHP不满意解压缩C ++压缩字符串。

编辑2 :我试用了zpipe.c示例程序,它正确地解压缩了PHP压缩的字符串并生成了PHP可以解压缩的压缩字符串。显然,我的C ++代码中存在问题。我对compress和uncompress的使用不正确,或者我正在读取和写入错误的文件。压缩或解压缩程序都不能与zpipe正确交互。

更新:我现在已经到了可以使用PHP压缩字符串并使用PHP或C ++读取它的地方,我可以使用C ++压缩字符串并使用C ++读取它,但是尝试用PHP读取它导致PHP警告:gzuncompress():数据错误。有什么不同会导致工作/不工作场景的组合?

1 个答案:

答案 0 :(得分:1)

Zlib的默认压缩级别为6 - 您可以尝试将其作为gzcompress for PHP上的第二个参数传递。

string gzcompress ( string $data [, int $level = -1 ] )

来自ZLIB manual

  

压缩级别必须是   Z_DEFAULT_COMPRESSION,或介于0之间   和9:1给出最佳速度,9给出   最好的压缩,0给不   完全压缩(输入数据是   只需一次复制一个块)。   Z_DEFAULT_COMPRESSION请求a   速度与速度之间的默认妥协   压缩(目前相当于   等级6)