gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:26:02 36 4
gpt4 key购买 nike

我正在从事一个项目,其中运行 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():数据错误。有什么不同会导致这种工作/不工作场景的组合?

最佳答案

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

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

来自ZLIB manual :

The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6)

关于php - 使用 zlib 在 C++ 和 PHP 之间移动压缩字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046244/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com