Не удается прочитать gzdecompress двоичные данные с python на php

#python #php #compression #decode #zlib

Вопрос:

Я отправляю данные с Python на PHP-сервер с помощью postman(для целей тестирования). ниже приведен пример кода python:

 import json
import zlib

data = {"owner": "test"}

compressed = zlib.compress(json.dumps(data).encode("utf-8"))
print(compressed)
 

Вывод приведенного выше кода python выглядит следующим образом:

 b'xx9cxabV*(xcfK-Rxb2RP*I-.Qxaax05x004x8cx05xc7'
 

Ниже приведен PHP-код для чтения этих данных:

 echo json_decode(zlib_decode($pythonCompressedBinary), TRUE);
 

Это пример запроса в postman

Когда я пытаюсь декодировать двоичный файл python в php, он терпит неудачу и выдает ошибку, она рассматривается как ошибка. я вручную вставил эту двоичную строку в свой php-код, и она тоже не удалась. Когда я попытался заменить одинарные кавычки на двойные коды вручную и сохранить их в переменной в php, то они успешно декодируются. Но когда я попытался заменить одинарную кавычку двойной кавычкой, используя str_replace() в php, декодирование все равно не удалось.

Я попытался hexlify() данные в python, а затем hex2bin() в php, затем я смог прочитать эти двоичные данные, и они успешно декодировались. Но я не хочу заниматься шестнадцатеричным процессом. я хочу прочитать двоичный файл напрямую и декодировать его на php.

Пожалуйста, помогите мне, как я могу декодировать эти двоичные сжатые данные python на стороне php.

Комментарии:

1. Я не могу помочь вам с вашей основной проблемой, но я могу сказать вам, что у вас есть байтовый объект , который является результатом преобразования ваших двоичных данных в строку, и это часто является результатом отладки, с которой вы работаете print . Для части zlib в целом это иногда/часто обрабатывается самим веб-сервером прозрачно, как при сжатии, так и при распаковке, поэтому я бы подтвердил, действительно ли вам нужно беспокоиться об этом в первую очередь.

Ответ №1:

Вы отправляете представление Python compressed , в отличие от compressed самого себя. compressed это последовательность байтов, которую zlib_decode() ожидает сторона PHP.

Не преобразуйте двоичные байты в строку, используя print в Python. Отправляйте байты напрямую.