更新于:2011-04-14 01:56:18 按自己的理解写的也不知道是否正确. #include <stdafx.h> #include "Packet.h" #include <map> /* **2011年4月13日 */ /* **封包操作 ** in:数据包的长度(packLen), 客户端请求的操作(opera), 流水号(id) **out:数据包的数据(data) */ void PackData( string& data, int opera, int id, int packLen) { packLen += data.size(); char *temp = new char[12]; _snprintf(temp, 12,"%04d%04d%04d", packLen, opera, id ); temp[12]='/0'; string strHead(temp); data = strHead.append(data); } /* **解包操作 ** in:收到的数据包指针(recvPack), 解包后的数据结构引用(refPacket) **out:解包后的数据结构引用(refPacket) */ void UnPackData( const char *recvPack, PACKET& refPacket ) { string tempRecvPack(recvPack); refPacket.m_PacketLength = tempRecvPack.size(); refPacket.m_Data = tempRecvPack.substr(12, refPacket.m_PacketLength - 12); refPacket.m_Opera = atoi(tempRecvPack.substr(4, 4).c_str()); refPacket.m_Id = atoi(tempRecvPack.substr(8, 4).c_str()); } /* **封装JSON ** in:封装前的JSON空串(refJSON), 不定形参的个数(argc) **out:封装后的JSON串(refJSON) **PS:不定形参只能为char*类型 */ void PackJSON( string &refJSON, const int argc,...) { string JSON(""); va_list argStart; va_start(argStart, argc); for( int j = 0; j < argc; ++j ) { if( (0 == j % 2) && (0 != j) ) { JSON.append(";"); } else if(0 != j % 2) { JSON.append(":"); } else{} JSON.append( string(va_arg(argStart, char*))); } va_end(argStart); refJSON = JSON; } /* **解封JSON ** in:封装好的JSON串(refJSON) **out:解封后的数据集合(refUnJSON) */ void UnPackJSON( map<string, string>& refUnJSON,const string &refJSON) { const char *ptrJSON = refJSON.c_str(); int begin = 0, end = 0; string key(""), value(""); for(int i = 0; i <= refJSON.size(); ++i ) { if(*(ptrJSON + i) == ':') { end = i; key = refJSON.substr(begin, end - begin); begin = end + 1; } if( *(ptrJSON + i) == ';' || *(ptrJSON + i) == '/0') { end = i; value = refJSON.substr(begin, end - begin); begin = end + 1; refUnJSON[key] = value; } } }