Расшифровка сжатой строки в PHP

Я пытаюсь декодировать сжатое тело ответа REST (YouTrack-API) с помощью PHP. Кажется, ничего не работает:

  • Автоматическое декодирование из CURL ничего не делает
  • Использование Guzzle с заголовками, настроенными на принятие кодировки, ничего не дает
  • Простое помещение полученной строки в gzdecode () ничего не делает

Я пробовал gzinflate, gzdecode и некоторые их дикие комбинации, включая удаление байтов в начале и в конце, но безуспешно. Я ни в коем случае не эксперт в сжатии, поэтому я понятия не имею, существуют ли даже разные форматы, которые может принимать gzip-строка, но любая старая `` онлайн-служба gzip '' может декодировать строку без каких-либо проблем.

Простой пример: Эта строка:

H4sIAAAAAAAA//NIzcnJV8jPSVEozy/KSQEARAYhbw8AAAA=

должен выводить:

Hello old world

Поместите в любой онлайн-конвертер, который я смог найти, он работает, поместите в любую из функций PHP: ошибка данных. В чем дело, что PHP и gzip вообще не работают? имеет ли это какое-то отношение к сжатию всего ответа или только к его содержимому?


person RemizZ    schedule 03.08.2018    source источник


Ответы (1)


Строка в формате gzip имеет кодировку base64, поэтому вам необходимо сделать:

echo gzdecode(base64_decode('H4sIAAAAAAAA//NIzcnJV8jPSVEozy/KSQEARAYhbw8AAAA='));
person Gordon    schedule 03.08.2018
comment
Спасибо ... Но откуда это знать? Этот API просто заявляет, что он сжат с помощью gzip, и никогда не упоминается, что он закодирован в base64. Можете ли вы просто «увидеть» это по тому, как выглядит струна? - person RemizZ; 03.08.2018
comment
@RemizZ = используется в качестве заполнения в конце строк, закодированных по основанию 64. Если вы видите строку, состоящую из буквенно-цифровых символов + и / со знаком равенства в конце, можно с уверенностью сказать, что она закодирована в base64. - person iainn; 03.08.2018
comment
@RemizZ, что сказал iainn. Кроме того, я раньше работал с gzip API;) - person Gordon; 03.08.2018
comment
Да, это просто видно. Хорошо сжатые данные будут неотличимы от случайных данных и, следовательно, будут иметь равномерное распределение всех байтовых значений от 0 до 255. Если строка содержит только печатаемые символы, то есть менее 96 из возможных 256, тогда вы знаете, что либо он не сжат или представляет собой кодировку сжатых двоичных данных. Наиболее распространенной такой кодировкой является Base-64, в которой используются один или два (или ноль) завершающих знак равенства. Так что это будет первая попытка получить эти данные. - person Mark Adler; 04.08.2018