10

我在 PHP 中有一个 SOAP 客户端,它调用 WSDL 服务。其中一个函数返回base64binary数据。我一直试图在没有任何运气的情况下对其进行解码。

base64_decode($encoded_base64data) 将不起作用。我尝试使用带有各种参数的 base_convert() 和 mv_convert_encoding(),但无法获得正确的结果。

编码结果数据以:

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

(数据要长得多,这只是字符串的一小部分)

知道怎么做吗?

谢谢

编辑

我使用新的 __doRequest() 方法扩展了 SoapClient,以检查接收到的数据是否是正确的 base64 字符串。我得到了一个正确的 base64 编码字符串,上面显示的结果是解码后的响应。

无论如何,SoapClient 自动将字符串从 base64 解码为二进制(正如@hakre 建议的那样),所以我只需要处理二进制响应。

现在我需要将二进制字符串解码为看起来像可读格式的东西。最终响应应该包含格鲁吉亚语输出,所以我试图找出原始编码(但这是一个不同的问题)。

4

2 回答 2

13

来自base64Binary(XML 架构第 2 部分:数据类型 3.2.16)

[定义:] base64Binary表示 Base64 编码的任意二进制数据。base64Binary值空间是二进制八位字节的有限长度序列的集合。对于base64Binary数据,整个二进制流使用[RFC 2045] 第 6.8 节中定义的 Base64 Content-Transfer-Encoding 进行编码。

然后你评论:

当 WSDL 具有 xsd:base64binary 时,我应该获得 base64 响应还是二进制响应或 base64 编码字符串?

你应该得到一个base64编码的字符串。该 base64 编码字符串表示二进制数据。如果您了解 XML 规范,这可能会更明显,因为您不能使用 XML 传递二进制信息,您只能传递适合 XML 字符范围的信息。并且该范围不包括作为二进制数据一部分的字符,尤其是控制字符和更高的窗格,如果您将二进制八位字节划分为较低和较高的一个。请参阅Characters (Extensible Markup Language (XML) 1.0 (Fifth Edition) 2.2),它表明 XML 是关于字符的,而不是二进制数据。它还显示了这些字符确实形成了哪些二进制数据(以及它们不能形成哪些二进制数据)。

因此,base64Binary编码已被定义为在 XML 文档中传输二进制数据的一种方式。因此,您在对 SOAP 请求的原始 XML 响应中得到的绝不是二进制数据,而是 base64 编码的二进制数据。

注意您的 SOAP 客户端可能已经处理了这种编码并提供了解码的数据。

于 2013-06-10T09:07:57.450 回答
9

虽然之前的答案是绝对正确的,但我觉得这可能有助于快速解决问题。

当我们检查响应 xml 时,我们会看到 base64 编码的数据,我们尝试在代码中对其进行解码以获取真实数据,但这不是必需的。

删除base64_decode.

因为 SOAP 客户端会在内部自行解码。

于 2014-10-14T05:23:11.203 回答