报文拼接与解析
#ifndef _NMS_MESSAGE_H_ #define _NMS_MESSAGE_H_ #include "config.h" #define LENGTH 5 //报文长度 #define TRANSTYPE 4 //交易代码 #define SUBTYPE 2 //标志字段 #define APPID 12 //应用标识 #define PASSWD 21 //应用程序密码 #define APPSNO 35 //应用流水号 #define MESSAGETYPE 3 //短信类型0表示中文;1表示英文;2表示UCS2码;21,4为压缩PDU码 #define RECVID 255 //接收方地址 #define CONTENT1002 160 //正文内容 #define CONTENT3002 280 #define ACK 1 //0表示不回复,1表示需要回执,2表示需回复,3表示需要回执+需回复 #define REPLY 30 //回复地址 #define PRIORITY 2 //优先级0~9 #define REP 2 //重复次数 #define SUBAPP 3 //子应用号 #define CHECKFLAG 2 //标志位 class CMessagePasswd { public: CMessagePasswd(string transtype,string subtype,string appid,string passwd); ~CMessagePasswd(){}; string getString(); int getLength() const;//Length值 int getSize() const;//报文总长度 private: string Length; string TransType; string SubType; string AppId; string Passwd; }; class CMessageLong{ public: CMessageLong(string transtype,string subtype,string appid,string appserialno,string messagetype,string recvid,string ack,string reply, string priority,string rep,string subapp,string checkflag,string content); ~CMessageLong(){}; string getString(); int getLength() const;//Length值 int getSize() const;//报文总长度 private: string Length; string TransType; string SubType; string AppId; string AppSerialNo; string MessageType; string RecvId; string Ack; string Reply; string Priority; string Rep; string SubApp; string CheckFlag; string Content;//变长字段,长度另外计算 }; class CMessageReply{ public: CMessageReply(string s); ~CMessageReply(){}; //const修饰类的成员函数会禁止该函数改变类的成员变量的值 bool Success() const;//成功返回TRUE,失败返回FALSE string GetFailReason() const;//返回失败原因 string getLength() const;//备用,返回响应报文长度 string getRetCode() const;//备用, 返回响应代码 private: int temp; string Length; string RetCode; string RetMsg; }; #endif
#include "NmsMessage.h" CMessagePasswd::CMessagePasswd(string transtype,string subtype,string appid,string passwd) { TransType = transtype; TransType.resize(TRANSTYPE,'\t'); SubType = subtype; SubType.resize(SUBTYPE,'\t'); AppId = appid; AppId.resize(APPID,'\t'); Passwd = passwd; Passwd.resize(PASSWD,'\t'); } string CMessagePasswd::getString() { string x; char temp[10]; itoa(getLength(),temp,10); Length = temp; Length.resize(LENGTH,'\t'); x.append(Length); x.append(TransType); x.append(SubType); x.append(AppId); x.append(Passwd); return x; } int CMessagePasswd::getLength() const//Length值 { return getSize()-LENGTH; } int CMessagePasswd::getSize() const//报文总长度 { return LENGTH+TRANSTYPE+SUBTYPE+APPID+PASSWD; } CMessageLong::CMessageLong(string transtype,string subtype,string appid,string appserialno,string messagetype,string recvid,string ack,string reply, string priority,string rep,string subapp,string checkflag,string content) { TransType = transtype; TransType.resize(TRANSTYPE,'\t'); SubType = subtype; SubType.resize(SUBTYPE,'\t'); AppId = appid; AppId.resize(APPID,'\t'); AppSerialNo = appserialno; AppSerialNo.resize(APPSNO,'\t'); MessageType = messagetype; MessageType.resize(MESSAGETYPE,'\t'); RecvId = recvid; RecvId.resize(RECVID,'\t'); Ack = ack; Ack.resize(ACK,'\t'); Reply = reply; Reply.resize(REPLY,'\t'); Priority = priority; Priority.resize(PRIORITY,'\t'); Rep = rep; Rep.resize(REP,'\t'); SubApp = subapp; SubApp.resize(SUBAPP,'\t'); CheckFlag = checkflag; CheckFlag.resize(CHECKFLAG,'\t'); Content = content; //Content.resize(CONTENT3011,'\t'); } string CMessageLong::getString() { string x; char temp[10]; itoa(getLength(),temp,10); Length = temp; Length.resize(LENGTH,'\t'); x.append(Length); x.append(TransType); x.append(SubType); x.append(AppId); x.append(AppSerialNo); x.append(MessageType); x.append(RecvId); x.append(Ack); x.append(Reply); x.append(Priority); x.append(Rep); x.append(SubApp); x.append(CheckFlag); x.append(Content); return x; } int CMessageLong::getLength() const//Length值 { return getSize()-LENGTH; } int CMessageLong::getSize() const//报文总长度 { return LENGTH+TRANSTYPE+SUBTYPE+APPID+APPSNO+MESSAGETYPE+RECVID+ACK+REPLY+PRIORITY+REP+SUBAPP+CHECKFLAG+Content.size(); } CMessageReply::CMessageReply(string s) { Length = s.substr(0,5); RetCode = s.substr(5,4); temp = atoi(Length.c_str()); RetMsg = s.substr(9,temp-4); } bool CMessageReply::Success() const//成功返回TRUE,失败返回FALSE { if (RetCode == "0000") return true; else return false; } string CMessageReply::GetFailReason() const//返回失败原因 { return RetMsg; } string CMessageReply::getLength() const//备用,返回响应报文长度 { return Length; } string CMessageReply::getRetCode() const//备用, 返回响应代码 { return RetCode; }