Gsoap 返回图片byte的困惑c++
前些日子刚使用gsoap将二进制文件上传(服务期端使用c# wcf 编写),上传功能实现没有问题.c#
这几天又要接收从服务器端接收图片的byte数据.困惑了好几天,最终在Bill wang的帮助下解决问题.服务器
总结如下,希望能对有一样遭遇的兄弟有所帮助.工具
一、返回byte数据编码
c++调用代码以下:url
struct _ns1__USCOREGetPicture getPicture; struct _ns1__USCOREGetPictureResponse getPictureR; xsd__base64Binary *image; getPicture.pictureName="1.png"; getPicture.soap=&clientSOAP; pgcFile.soap_endpoint=strurlpath.c_str(); int soapResultTest=pgcFile.USCOREGetPicture(&getPicture,&getPictureR); image=getPictureR.USCOREGetPictureResult;
FILE *fp_binary = fopen("C:\\2.jpg", "wb"); fwrite(image->__ptr, 1, image->__size, fp_binary); fclose (fp_binary);
//直接存成文件没有问题,问题获得解决
1.1 出现问题:
困惑的地方:image->__ptr=" j"只有这些数据, 而image->__size=1987256 正确没有问题.
1.2 处理问题过程:
当时候一看到image->__ptr值后,困惑,就直接考虑返回的图片的其余数据都到那去了(走了弯路)开始怀疑是c#服务端的问题,找了抓包工具,把soap包抓下来分析下,服务器端传过来的数据没有问题,是正确的。 (后来通过Bill wang的帮助,其实不用包抓那么麻烦,stdsoap2.h:819 取消注释便可,生成debug 日志文件)调试到当soap中的base64数据被反base64时,全部数据都被反编码成byte,存储到了char * soap->labbuf 中。数据image->__ptr=" j",很是困惑,为何全部编码都成功了,数据仍是他image->__ptr=" j"。
1.3 结论:(不必定正确,请高手指点)
因为图片二进制数据,因此会有单byte为00的编码,char * 字符串遇到 00 标记为字符串结束,因此显示image->__ptr=" j"。而实际字符串已经所有转码,存储到了物理的实际位置。因此使用编码首地址+实际长度,能够取到正确数据。而不能直接取image->__ptr的数据。
spa
二、剩余困惑debug
gsoap中soap->buf存放soap数据,而他的大小默认65535,可是我2w的图片数据传输正确?调试
请高手指点!!日志
在此感谢Bill wang的帮助。