c 处理基于java服务端byte[]数组接收图片( xsd__base64Binary)
2015-06-23 11:44
183 查看
背景:java端基于webservice实现服务端,c作为客户端,通过gsoap传输图片给服务端。
实现步骤:
1、c端通过服务端wsdl文件生成客户端代码,图片接收部分的结构体如下:
2、读取图片数据,并赋值给次结构体
3、代码示例
实现步骤:
1、c端通过服务端wsdl文件生成客户端代码,图片接收部分的结构体如下:
struct xsd__base64Binary{ unsigned char *__ptr; int __size; char *id; /* optional element of type xsd:string */ char *type; /* optional element of type xsd:string */ char *options; /* optional element of type xsd:string */ };
2、读取图片数据,并赋值给次结构体
merchantLogoByte.__ptr = soap_malloc( &add_soap, size); memcpy(merchantLogoByte.__ptr, data, size); //data 图片数据 merchantLogoByte.__size = size; //size图片大小
3、代码示例
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "AppWebServiceSoapBinding.nsmap" #include "soapH.h" #include "soapStub.h" #define BUFSIZE 10240 /**************************************************************** 函数说明 :pos签到 入口参数 :mbs数据结构体 返回类型 :交易结果 0-成功 非0-失败 初始时间 :2014-9-18 yuweichao 修改记录 : 用途功能 :用于去后台校验版本信息、生成POS机一级菜单。 ****************************************************************/ int main () { struct soap add_soap; struct ns3__AddMerchantRequest _request; struct ns4__spWSProcessRegistResponse _param_7; struct xsd__base64Binary merchantLogoByte; char aRcvmsg_buf[BUFSIZE]; char aTmp[256] = {0}; memset(&_request, 0x00, sizeof(struct ns3__AddMerchantRequest)); memset(&_param_7, 0x00, sizeof(struct ns4__validateAdminTelCellNumResponse)); memset(&merchantLogoByte, 0x00, sizeof(struct xsd__base64Binary)); // sleep(10); printf("交易处理开始 \n"); soap_init (&add_soap); soap_set_mode(&add_soap,SOAP_C_UTFSTRING); /*设置字符集,要不客户端及服务端都会乱码*/ soap_set_namespaces(&add_soap, namespaces);/*分配命名空间*/ add_soap.connect_timeout = 60;/*设置连接超时时间 大于0 seconds 小于 0 usec*/ add_soap.send_timeout = 60;/*设置发送超时时间 大于0 seconds 小于 0 usec*/ add_soap.accept_timeout = 60;/*设置接收超时时间 大于0 seconds 小于 0 usec*/ add_soap.recv_timeout = 60;/*设置接收超时时间 大于0 seconds 小于 0 usec*/ _request.adminName = "Yu"; _request.adminPwd ="bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a"; _request.adminTelCellNum = "11111111111"; _request.merchantAddress ="西安"; _request.merchantClassfiy="2"; _request.merchantEmail ="hh@163.com"; _request.merchantName ="610166010002"; _request.merchantTelephone = "11111111111"; /*图片数据处理*/ FILE *fp = fopen("qr.jpg", "rb"); if (fp == NULL) { fprintf(stderr, "cannot open image file\n"); exit(1); } fseek(fp, 0, SEEK_END); if (ferror(fp)) { fprintf(stderr, "fseek() failed\n"); int r = fclose(fp); if (r == EOF) { fprintf(stderr, "cannot close file handler\n"); } exit(1); } int flen = ftell(fp); if (flen == -1) { perror("error occurred"); int r = fclose(fp); if (r == EOF) { fprintf(stderr, "cannot close file handler\n"); } exit(1); } fseek(fp, 0, SEEK_SET); if (ferror(fp)) { fprintf(stderr, "fseek() failed\n"); int r = fclose(fp); if (r == EOF) { fprintf(stderr, "cannot close file handler\n"); } exit(1); } char data[flen+1]; //merchantLogoByte.__ptr = (unsigned char*)soap_malloc( &add_soap, flen); int size = fread(data, 1, flen, fp); //int size = fread(merchantLogoByte.__ptr, 1, flen, fp); if (ferror(fp)) { fprintf(stderr, "fread() failed\n"); int r = fclose(fp); if (r == EOF) { fprintf(stderr, "cannot close file handler\n"); } exit(1); } int r = fclose(fp); if (r == EOF) { fprintf(stderr, "cannot close file handler\n"); } printf("%d\n [%#x]\n", size, data); merchantLogoByte.__ptr = soap_malloc( &add_soap, size); memcpy(merchantLogoByte.__ptr, data, size); //merchantLogoByte.__ptr = data; //strcpy(merchantLogoByte.__ptr, data); merchantLogoByte.__size = size; _request.merchantLogoByte = &merchantLogoByte; if (soap_call_ns4__spWSProcessRegist(&add_soap, NULL, NULL, &_request, &_param_7) == SOAP_OK) { printf( "%s(%s):%d|Call webservce OK [%s] [%s]\n",__FILE__,__FUNCTION__,__LINE__, _param_7._spWSProcessRegistReturn->resultCode, _param_7._spWSProcessRegistReturn->resultMsg); } else { printf("%s(%s):%d|soap err:%d,%s,%s",__FILE__,__FUNCTION__,__LINE__,add_soap.error,*soap_faultcode(&add_soap),*soap_faultstring(&add_soap)); return -1; } soap_end(&add_soap); /*清除运行环境变量*/ soap_done(&add_soap); /*卸载运行环境变量*/ return 0; }
相关文章推荐
- 【转】线程同步------java synchronized详解
- JavaSE_基础库类_String类
- Java核心API -- 6(Collection集合List、Set、ArrayList、HashSet)
- spring-mvc入门
- Spring Web MVC 原理学习(上)
- JavaSE_基础库类_简介
- Java学习笔记Class类
- JavaSE_面向对象(封装、继承、多态)
- java mail
- java1.5新增Enum(枚举类)
- 【j2ee spring】37、巴巴运动网的产品品牌修改和查询
- Java培训Java序列化与static
- Java编程基础抽象类
- java中读取文件以及向文件中追加数据的总结
- Java面向对象的三大特征
- Java 读取数据流的几种情况总结
- Java编程基础抽象类
- stackoverflow中关于数组方法
- 浅析Java线程的三种实现
- 使用Spring2.5的Autowired实现注释型的IOC