Gsoap 使用心得 2

                                     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的幫助。

相關文章
相關標籤/搜索