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

C++ gSOAP:RPC截断std::string中的二进制数据,c++,stl,gsoap,C++,Stl,Gsoap,我的问题是专门处理gSOAP中未通过RPC正确发送的二进制数据。我仅限于将二进制文件存储为std::string。在大多数情况下,只有一小部分预期的二进制数据通过导线发送。我认为这是因为gSOAP无法正确处理填充的std::string中包含的某些字符 我的gSOAP客户端应用程序需要向相应的gSOAP服务器应用程序发送几个不同的二进制文件,包括第三方应用程序的RPM。在XML到H和CPP转换过程中,我只限于自动生成的C++接口。我提供下面的课程 programUpdate类如下所示: clas

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

我的gSOAP客户端应用程序需要向相应的gSOAP服务器应用程序发送几个不同的二进制文件,包括第三方应用程序的RPM。在XML到H和CPP转换过程中,我只限于自动生成的C++接口。我提供下面的课程

programUpdate类如下所示:

class SOAP_CMAC _ns1__setProgramUpdate
{
public:
    std::string programPatch;
    struct soap *soap;
    ....
}
因此,我仅限于将二进制数据存储为std::string。根据我的研究,std::string似乎可以处理所有类型的字符;在心脏,弦只是一个装着chars的容器


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

XML,因此SOAP,不允许使用任意二进制数据,而不允许对XML中非法的字符进行编码。要在gSOAP中实现您想要的功能,您需要查看GSOAP2.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;
    ....
};

如果没有对XML中非法的字符进行编码的规定,XML以及SOAP不允许使用任意二进制数据。要在gSOAP中实现您想要的功能,您需要查看GSOAP2.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;
    ....
};

该方法的WSDL是什么样子的?XML和二进制通常不能很好地混合。如果希望您对数据进行base64或十六进制编码,使其成为文本,我不会感到惊讶?XML和二进制通常不能很好地混合。如果希望您对数据进行base64或十六进制编码,使其成为文本,我不会感到惊讶。