2010-10-28 75 views
0

我工作的一个项目,其中运行PHP在Windows Web服务器进行通信与运行用C++编写的应用程序后端Linux服务器的连接速度极慢。由于两台机器之间的连接速度很慢,我想压缩它们之间的流量。移动压缩C++和PHP字符串与zlib的

我已经得到了我在哪里可以压缩一个字符串,将其保存到一个文件,读取文件,并解压缩在C++中使用zlib的字符串,同样在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++代码中。我的压缩和解压缩使用不正确,或者我正在读写文件不正确。压缩或解压缩程序都不能与zpipe正确交互。

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

+0

这不是你正在使用的(DE)压缩++的C,这仅仅是个函数声明。 – 2010-10-28 18:57:42

+0

他们是图书馆电话。压缩的,compressedLength等是我正在使用的变量的实际名称,并且由于Zlib使用它自己的类型而不是标准类型,所以当我进行调用时,我正在投射它们。 – 2010-10-28 19:00:08

+0

请问您可以发布完全更新的代码吗?谢谢。 – cedivad 2011-12-26 21:48:40

回答

1

的Zlib的默认压缩级别为6 - 你可以尝试通过作为上gzcompress for PHP第二PARAM。

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

ZLIB manual

压缩级别必须是 Z_DEFAULT_COMPRESSION,或0和之间 9:1给出了最佳的速度,9给出 最佳压缩,0没有给出 压缩在所有(输入数据是 一次只复制一个块)。 Z_DEFAULT_COMPRESSION要求速度和 压缩之间的 默认妥协(目前相当于 6级)

+0

您可能还想确保其他设置和库版本可以相同或兼容。 – ssube 2010-10-28 19:04:07

+0

更改压缩级别似乎对PHP方面没有影响。它可以工作,不管我设定的水平如何。如果我改变压缩级别,C++端不正确的解压缩是不同的,但至少0,6和9,它总是错误的。 – 2010-10-28 19:17:51

+0

奇怪。我不得不让ZLIB与C++,C#和Java一起工作,虽然文件不同,但解压缩总是可以工作的。是否有一些流或文件冲洗操作,你没有在两端做? – 2010-10-28 19:19:25