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