zoukankan      html  css  js  c++  java
  • 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, 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的数据。


    2、剩余困惑

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

         请高手指点!!

     在此感谢Bill wang的帮助。

  • 相关阅读:
    Go 交叉编译
    go module 基本使用
    win10中安装Linux子系统
    VsCode/Pycharm配合python env 使用
    python virtualenv 基本使用
    Django 知识点小记
    Django中一种常见的setting与账密保存/读取方式
    win安装python模块出现依赖问题的解决方法 & No module named 'MySqldb'
    MySQL数据库文件
    如何在MySQL中分配innodb_buffer_pool_size
  • 原文地址:https://www.cnblogs.com/wymlvjing/p/3291470.html
Copyright © 2011-2022 走看看