gSOAP:RPC截断std::string中的二进制数据

gSOAP: RPC truncating binary data in std::string

本文关键字:二进制 数据 std RPC 截断 gSOAP string      更新时间:2023-10-16

我的问题专门处理在gSOAP中没有通过RPC正确发送二进制数据的问题。我被限制为将二进制文件存储为std::字符串。在大多数情况下,只有一小部分预期的二进制数据通过导线发送。我认为这是因为gSOAP无法正确处理填充的std::字符串中包含的某些字符。

我的gSOAP客户端应用程序需要向相应的gSOAP服务器应用程序发送一些不同的二进制文件,包括第三方应用程序的RPM。在xml到h和cpp的转换过程之后,我只能使用自动生成的C++接口。我提供下面的课程。

programUpdate类看起来像这样:

class SOAP_CMAC _ns1__setProgramUpdate
{
public:
    std::string programPatch;
    struct soap *soap;
    ....
}

因此,我被限制为将二进制数据存储为std::字符串。从我的研究来看,std::字符串似乎能够处理所有类型的字符;核心字符串只是一个字符容器。

那么,是什么原因导致通过gSOAP RPC通过有线发送数据来截断数据呢?

XML,以及SOAP,不允许在没有对XML中非法字符进行编码的情况下使用任意二进制数据。要在gSOAP中实现您想要的功能,您需要查看gSOAP 2.8.17用户指南的11.12节。它将帮助您设置一个二进制数据数组,gSOAP将在包含到SOAP信封中之前对其进行base64编码。还规定通过十六进制编码处理二进制数据;参见第11.13节。

对于您的情况,类似于此的声明可能就足够了:

class xsd__base64Binary 
{ 
   public: 
   unsigned char *__ptr; 
   int __size; 
};
class SOAP_CMAC _ns1__setProgramUpdate
{
public:
    xsd__base64Binary programPatch;
    struct soap *soap;
    ....
};