Gsoap 使用心得 2

时间:2023-03-09 02:03:38
Gsoap 使用心得 2

                                     Gsoap 返回图片byte的困惑

前些日子刚使用gsoap将二进制文件上传(服务期端使用c# wcf 编写),上传功能实现没有问题.

这几天又要接收从服务器端接收图片的byte数据.困惑了好几天,最终在Bill wang的帮助下解决问题.

总结以下,但愿能对有同样遭遇的兄弟有所帮助.

1、返回byte数据

    c++调用代码如下:

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, , 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的数据。

2、剩余困惑

gsoap中soap->buf存放soap数据,而他的大小默认65535,但是我2w的图片数据传输正确?

请高手指点!!

在此感谢Bill wang的帮助。