Intereting Posts
PHP проверяет, заблокирован ли файл flock ()? Laravel правильно определяет компоновку по умолчанию от контроллера Как заменить только последнее совпадение строки с preg_replace? Как настроить внутренний браузер для Aptana на Linux Расширение Symfony2 Twig «Доступ запрещен для пользователя» после перемещения базы данных MySQL на удаленный сервер Внедрение системы чата с помощью веб-браузера Laravel 5.2 нужен пример, который реализует драйверы аутентификации по умолчанию / «Multi-Auth». который требует много работ прямо сейчас, поскольку Был запрошен псевдоним «ScnSocialAuth_ZendSessionManager», но никакая служба не найдена Закрытие или создание_функции в PHP PUSH с использованием PHP, Ajax и Javascript / jQuery? хранить объекты php в элементе формы html и передавать объекты php через метод GET? Захват прогресса из командной строки В чем разница между MySQL, MySQLi и PDO? file_get_contents, сбой HTTP-запроса

Soap – base64 двоичные данные в PHP

У меня есть клиент SOAP на PHP, который вызывает вызовы службы WSDL. Одна из функций возвращает двоичные данные base64 . Я пытался декодировать его без везения.

base64_decode ($ encoded_base64data) не будет работать. Я попытался использовать base_convert () и mv_convert_encoding () с различными параметрами, но не смог получить правильный результат.

Закодированные данные результата начинаются с:

  `I %&/m {J J  t  `$ؐ@       iG#) *  eVe]f@ 흼  {    {    ; N'   ?\fdl  J ɞ!   ?~|?" 

(данные намного длиннее, это всего лишь небольшая часть строки)

Есть идеи, как это можно сделать?

благодаря

РЕДАКТИРОВАТЬ

Я расширил SoapClient новым методом __doRequest (), чтобы проверить, что полученные данные являются правильной строкой base64. Я получил правильную строку с кодировкой base64, и результат, показанный выше, является декодированным ответом.

Во всяком случае, строка была автоматически расшифрована SoapClient от base64 до двоичной (по предложению @hakre), поэтому мне нужно иметь дело только с двоичным ответом.

Теперь мне нужно декодировать двоичную строку во что-то, что будет выглядеть как читаемый формат. Окончательный ответ должен содержать выход из Грузии, поэтому я пытаюсь выяснить исходную кодировку (но это другой вопрос).

Из base64Binary (XML Schema Part 2: Datatypes 3.2.16) :

[Определение:] base64Binary представляет произвольные двоичные данные с кодировкой Base64. Пространство значений base64Binary представляет собой набор последовательностей конечной длины двоичных октетов. Для base64Binary данных весь двоичный поток кодируется с использованием Base64 Content-Transfer-Encoding, определенного в разделе 6.8 [RFC 2045] .

Затем вы прокомментируете:

Когда WSDL имеет xsd: base64binary, я должен получить ответ base64 или двоичный ответ или строку с кодировкой base64?

Вы должны получить строку с кодировкой base64. Эта закодированная строка base64 представляет двоичные данные. Если вы знаете спецификацию XML, это может быть более очевидным, потому что вы не можете передавать двоичную информацию с помощью XML, вы можете передавать только информацию, которая вписывается в характерный диапазон XML. И этот диапазон исключает символы, которые являются частью двоичных данных, особенно контрольных символов и верхней панели, если вы разделите двоичный октет на более низкий и более высокий. См. « Символы (расширяемый язык разметки (XML) 1.0 (пятое издание) 2.2), который показывает, что XML – это символы, а не двоичные данные. И также показывает, какие двоичные данные формируются этими символами (и которые они не могут сформировать).

Поэтому base64Binary encoding был определен как один из способов переноса двоичных данных в XML-документе. Итак, то, что вы получили внутри необработанного XML-ответа на ваш запрос SOAP, никогда не является двоичным, а двоичные данные с кодировкой base64.

Позаботьтесь, чтобы ваш SOAP-клиент уже имел дело с этой кодировкой и обеспечивал декодирование данных.

Хотя предыдущий ответ абсолютно правильный, но я считаю, что это может быть полезно для быстрого решения.

Когда мы проверяем ответ xml, мы видим кодированные данные base64, и мы пытаемся его декодировать в нашем коде, чтобы получить реальные данные, но это не требуется.

Удалите base64_decode .

Поскольку клиент SOAP внутренне декодирует себя.