Visual C++调用WebService服务接口常见数据类型转换
2016-06-17 17:39
453 查看
C++客户端调用webService服务会有两种情形:(1)C++客户端向webService插入数据;(2)从webService接口获取数据。在这数据传递过程中需要进行数据转换,下面对常见的数据类型转换进行总结:
(1)C++客户端向webService插入数据
a)std::string转换为std::string类型:
webservice接口的std::string类型实际是数据库中CHAR类型,在传递过程中由于编码不一样,如果不进行转换会出现中文乱码问题或者插入失败。因此需要将C++的ASCII码转换为UTF-8编码,下面是具体的转换代码:
Int64是有符号 64 位整数数据类型,相当于C++中的long long,下面的LONG64实质也是_int64类型。
获取时间可以有两种方式:(1)从界面的时间控件获得,界面获得时间值一般是SYSTEMTIME类型,webservice接口的时间类型为time_t类型,所以需要将SYSTEMTIME类型的时间值转换为time_t类型;(2)通过C++函数获取系统时间,系统时间包括两种类型:SYSTEMTIME类型和CTime类型,因为SYSTEMTIME类型更容易转换为time_t类型,所以通常获取SYSTEMTIEM类型时间。下面详细介绍时间值如何获取以及如何插入webservice接口。
从界面中获取时间并将它转换为time_t类型时间:
因为两个SYSTEMTIME类型时间相减后再转换为time_t类型后,会出现错误,所以时间差类型一般不保存为time_t类型,而是使用std::string类型,下面详细介绍,如何获取时间差及向webservice接口插入时间差。
BLOB类型在数据库中对应二进制数据流类型,在webservice接口中具体数据结构定义如下:
(1)C++客户端向webService插入数据
a)std::string转换为std::string类型:
webservice接口的std::string类型实际是数据库中CHAR类型,在传递过程中由于编码不一样,如果不进行转换会出现中文乱码问题或者插入失败。因此需要将C++的ASCII码转换为UTF-8编码,下面是具体的转换代码:
std::string CUtilily::ASCIItoUTF8(std::string lstr) { std::string lstrRet ; lstrRet.clear() ; try { if(lstr.size()) { int lnWBufLen = MultiByteToWideChar(CP_ACP ,0, lstr.c_str(),-1 ,NULL,0); if(lnWBufLen) { WCHAR* lpWBuf = new WCHAR[lnWBufLen]; memset(lpWBuf,0,lnWBufLen*sizeof(WCHAR)); if(MultiByteToWideChar(CP_ACP ,0, lstr.c_str(), -1 ,lpWBuf,lnWBufLen)) { int lnBufLen = WideCharToMultiByte( CP_UTF8 , 0 , lpWBuf ,-1 , NULL , 0 , NULL, NULL ) ; if(lnBufLen) { char* lpBuf = new char[lnBufLen+2]; //防止字符过短出现问题 memset(lpBuf,0,sizeof((lnBufLen+2)*sizeof(char))); if(WideCharToMultiByte( CP_UTF8 , 0 , lpWBuf ,-1 , lpBuf, lnBufLen , NULL, NULL )) { lstrRet = lpBuf ; } delete []lpBuf ; } } delete []lpWBuf ; } } else { lstrRet = _T(" ") ; } } catch (...) { lstrRet.clear() ; } return lstrRet ; }</span>b)std::string转换为float类型
std::string lstrInfo; float hannelOcc =atof(lstrInfo.c_str());</span>c)std:;string类型转换为_int64类型
Int64是有符号 64 位整数数据类型,相当于C++中的long long,下面的LONG64实质也是_int64类型。
std::string gz_frequence; LONG64 FREQ =_atoi64(gz_frequence.c_str());d)向webservice插入时间值
获取时间可以有两种方式:(1)从界面的时间控件获得,界面获得时间值一般是SYSTEMTIME类型,webservice接口的时间类型为time_t类型,所以需要将SYSTEMTIME类型的时间值转换为time_t类型;(2)通过C++函数获取系统时间,系统时间包括两种类型:SYSTEMTIME类型和CTime类型,因为SYSTEMTIME类型更容易转换为time_t类型,所以通常获取SYSTEMTIEM类型时间。下面详细介绍时间值如何获取以及如何插入webservice接口。
从界面中获取时间并将它转换为time_t类型时间:
SYSTEMTIME lsysTime; if(CXTPPropertyGridItemDate* lpBeginDateItem = DYNAMIC_DOWNCAST(CXTPPropertyGridItemDate, lpItems->FindItem(IDS_RMCP_REPORT_SIGNALSTART_TIME))) { //起始发射时段 if(lpBeginDateItem->GetAsSystemTime(lsysTime)) { SYSTEMTIME st = lsysTime ; struct tm gmb = { st.wSecond, st.wMinute, st.wHour, st.wDay, st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0,0}; m_report.gz_sigstart_time= mktime( &gmb ) ; } }从系统获取SYSTEMTIME类型时间并将它转换为time_t类型:
SYSTEMTIME time,st; GetLocalTime(&time); st=time; m_code.SytemTimeAdd8Hour(st); struct tm gmb1 = { st.wSecond, st.wMinute, st.wHour, st.wDay, st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0,0}; m_report.gz_sigend_time= mktime( &gmb1 ) ;C++获取的系统时间与webservice接口时间会有8小时时差,所以需要在系统时间基础上再加上8个小时,
SYSTEMTIME CMyCode::SytemTimeAdd8Hour(SYSTEMTIME& st) { if (st.wHour+8<24) { st.wHour=st.wHour+8; } else { st.wHour=st.wHour+8-24; switch(st.wMonth) { case 2: //判断是否为闰年 if (IsLeapYear(st.wYear)) { if (st.wDay+1<30) { st.wDay=st.wDay+1; } else { st.wDay=1; st.wMonth=st.wMonth+1; } } else { if (st.wDay+1<29) { st.wDay=st.wDay+1; } else { st.wDay=1; st.wMonth=st.wMonth+1; } } break; case 1: case 3: case 5: case 7: case 8: case 10: if (st.wDay+1<32) { st.wDay=st.wDay+1; } else { st.wDay=1; st.wMonth=st.wMonth+1; } break; case 12: if (st.wDay+1<32) { st.wDay=st.wDay+1; } else { st.wDay=1; st.wMonth=1; st.wYear=st.wYear+1; } break; case 4: case 6: case 9: case 11: if (st.wDay+1<31) { st.wDay=st.wDay+1; } else { st.wDay=1; st.wMonth=st.wMonth+1; } break; } } return st; }e)向webservice插入时间差
因为两个SYSTEMTIME类型时间相减后再转换为time_t类型后,会出现错误,所以时间差类型一般不保存为time_t类型,而是使用std::string类型,下面详细介绍,如何获取时间差及向webservice接口插入时间差。
//创建时获取创建时间 SYSTEMTIME m_startTime; GetlocalTime(m_startTime); //创建时获取创建时间 SYSTEMTIME m_endTime; GetlocalTime(m_endTime); //SYSTEMTIME转换为CTime CTime stcm(m_startTime),edcm(m_endTime); CTimeSpan span=edcm-stcm; m_report.gz_sigmaxsustain_time=span.Format("%H:%M:%S");f)向webservice插入BLOB类型
BLOB类型在数据库中对应二进制数据流类型,在webservice接口中具体数据结构定义如下:
class SOAP_CMAC xsd__base64Binary { public: 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 */ struct soap *soap; /* transient */ public: virtual int soap_type() const { return 7; } /* = unique id SOAP_TYPE_Bsdrtmservice_xsd__base64Binary */ virtual void soap_default(struct soap*); virtual void soap_serialize(struct soap*) const; virtual int soap_put(struct soap*, const char*, const char*) const; virtual int soap_out(struct soap*, const char*, int, const char*) const; virtual void *soap_get(struct soap*, const char*, const char*); virtual void *soap_in(struct soap*, const char*, const char*); xsd__base64Binary() { xsd__base64Binary::soap_default(NULL); } virtual ~xsd__base64Binary() { } };在向webservice插入BLOB数据类型时,首先需要将需要传递的数据拼接成字符串,然后将字符串转换为xsd_base64Binary类型,即二进制流,下面是具体转换代码:
std::string str="需要传递的内容拼接成的字符串"; entity[i].MidFreqSLine = new Bsdrtmservice::xsd__base64Binary; entity[i].MidFreqSLine->__size = str.length(); entity[i].MidFreqSLine->__ptr=(unsigned char*)lcFPReport.gz_interfreq_content.c_str();
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 开发人员、程序员与计算机科学家三者之间的区别
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 程序员必备,程序员四大忌
- 程序员们,做好你手里的俩份试卷
- 程序员必备的10大健康装备! 我们要工作更要健康!
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- VS2008中文试用版改为正式版的破解方法
- 一篇关于程序员性格的文章第1/3页
- 8种类型极品程序员,不知你属于哪一种?
- C++联合体转换成C#结构的实现方法
- 程序员编程从初级到中级的10个秘诀
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析