Перемещение сжатых строк между C ++ и PHP с помощью zlib - PullRequest
0 голосов
/ 28 октября 2010

Я работаю над проектом, где веб-сервер Windows, на котором работает PHP, обменивается данными по очень медленному соединению с внутренним сервером Linux, на котором выполняется приложение, написанное на C ++.Поскольку соединение между двумя компьютерами очень медленное, я хотел бы сжать трафик, перемещающийся между ними.

Я попал туда, где могу сжать строку, сохранить ее в файл, прочитать файли распакуйте строку в 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 - это то, что открыло мое первоначальное исследование, но если есть лучший способ сделать это, у меня все на слух.

Edit : На самом деле, после небольшого дополнительного тестирования, кажется, что C ++работал с моим первоначальным тестовым примером, но не универсально.Я попытался сделать это с помощью ввода "hellohellohello", и при распаковке он сообщил о Z_DATA_ERROR и распаковал его просто "hello".Я предполагаю, что это означает, что я делаю что-то не так на стороне C ++, что может объяснить, почему PHP недоволен распаковкой сжатых строк C ++.

Edit 2 : я опробовал пример zpipe.cпрограмма, и она правильно распаковывает строки, сжатые PHP и создает сжатые строки, которые PHP может распаковать.Очевидно, что проблема (ы) существуют в моем коде C ++.Либо я использую сжатие и распаковку неправильно, либо я неправильно читаю и пишу файл.Ни программы сжатия, ни распаковки не взаимодействуют корректно с zpipe.

Обновление : я теперь дошел до того, где могу сжать строку с помощью PHP и прочитать ее с помощью PHP или C ++, и яможет сжать строку с C ++ и прочитать ее с C ++, но попытка чтения с помощью PHP приводит к PHP Предупреждение: gzuncompress (): ошибка данных.Что может быть другим, что могло бы привести к такой комбинации рабочих / не рабочих сценариев?

1 Ответ

1 голос
/ 28 октября 2010

Уровень сжатия Zlib по умолчанию равен 6 - вы можете попробовать передать его в качестве второго параметра в gzcompress for PHP .

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

Из руководства ZLIB :

Уровень сжатия должен быть Z_DEFAULT_COMPRESSION или между 0 и 9: 1 дает лучшую скорость, 9 дает лучшее сжатие, 0 не дает сжатие вообще (входные данные просто скопировал блок за раз). Z_DEFAULT_COMPRESSION запрашивает компромисс по умолчанию между скоростью и сжатие (в настоящее время эквивалентно уровень 6)

...