2013-06-03 2 views
8

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

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

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

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

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

Любая идея, как это может быть сделано?

Благодаря

EDIT

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

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

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

+1

«Не работает», «различные параметры» и «правильный результат» не очень полезны. Покажите точный ввод, точный код, точный вывод и ожидаемый результат. – CodeCaster

+0

base64_decode ($ encoded_base64data) означает, что он не даст правильную строку (с ожидаемой кодировкой). Это верно для всех моих других попыток. Различные параметры: «BASE64» и «UTF-8» для mv_convert_encoding() и некоторые целые числа для base_convert(). Ни один из них не дал мне хорошо декодированного ответа .... – galchen

+0

«Точный код» был бы base64_decode ($ encoded_base64data). Я думаю, что вопрос уже достаточно ясен. – galchen

ответ

11

От base64Binary (XML Schema Part 2: Datatypes 3.2.16):

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

Вы затем комментарий:

Когда WSDL имеет XSD: base64Binary я должен получить ответ base64 или бинарный ответ или в кодировке Base64?

Предполагается получить строку с кодировкой base64. Эта закодированная в base64 строка представляет двоичные данные. Если вы знаете спецификацию XML, это может быть более очевидным, потому что вы не можете передавать двоичную информацию с помощью XML, вы можете передавать только информацию, которая вписывается в характерный диапазон XML. И этот диапазон исключает символы, которые являются частью двоичных данных, особенно контрольных символов и верхней панели, если вы разделите двоичный октет на более низкий и более высокий. См. Characters (Extensible Markup Language (XML) 1.0 (Fifth Edition) 2.2), в котором показано, что XML - это символы, а не двоичные данные. И также показывает, какие двоичные данные формируются этими символами (и которые они не могут сформировать).

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

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

+1

Вывод уже был автоматически декодирован SoapClient, как вы предложили. Еще не решил мою проблему, но определенно ответил на мой вопрос. Спасибо – galchen

+0

Отлично подходит для указания, что SoapClient автоматически управляет кодировкой. Я делал двойную кодировку: / –

6

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

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

Удалить base64_decode.

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

Смежные вопросы