我为客户端和服务器制定了协议。如何使Serialize
和UnSerialize
函数解决大端或小端的问题,以满足跨平台的可移植性。
struct STRU_PRO_BASE {
public:
STRU_PRO_BASE(WORD type)
: m_wType(type)
{
}
virtual long Serialize(char szBuf[], long szBufLen) = 0;
virtual BOOL UnSerialize(const char szBuf[], long szBufLen) = 0;
protected:
WORD m_wType;
};
struct STRU_PRO_LOGIN_RQ : public STRU_PRO_BASE {
public:
STRU_PRO_LOGIN_RQ();
long Serialize(char szBuf[], long szBufLen);
BOOL UnSerialize(const char szBuf[], long szBufLen);
static long MIN_LEN; //immobilization length
public:
INT64 m_i64UserId;
WORD m_wPasswdLen; //according to this len to send and recv
char m_pPasswd[MAX_PASS_LEN];
};
和我的Serialize
和UnSerialize
功能如下
long STRU_PRO_LOGIN_RQ::Serialize(char szBuf[], long szBufLen)
{
if (STRU_PRO_LOGIN_RQ::MIN_LEN > szBufLen)
return -1;
//type
*(WORD*)szBuf = m_wType;
szBuf += sizeof(m_wType);
//id
*(INT64*)szBuf = m_i64UserId;
szBuf += sizeof(m_i64UserId);
//passwdLen
*(WORD*)szBuf = m_wPasswdLen;
szBuf += sizeof(m_wPasswdLen);
szBufLen -= STRU_PRO_LOGIN_RQ::MIN_LEN;
if (szBufLen < m_wPasswdLen)
return -1;
//passwd
memcpy(szBuf, m_pPasswd, m_wPasswdLen);
szBuf += m_wPasswdLen;
return (STRU_PRO_LOGIN_RQ::MIN_LEN + m_wPasswdLen);
}
BOOL STRU_PRO_LOGIN_RQ::UnSerialize(const char szBuf[], long szBufLen)
{
if (STRU_PRO_LOGIN_RQ::MIN_LEN > szBufLen)
return FALSE;
m_wType = *(WORD*)szBuf;
szBuf += sizeof(m_wType);
m_i64UserId = *(INT64*)szBuf;
szBuf += sizeof(m_i64UserId);
m_wPasswdLen = *(WORD*)szBuf;
szBuf += sizeof(m_wPasswdLen);
szBufLen -= STRU_PRO_LOGIN_RQ::MIN_LEN;
if (m_wPasswdLen > szBufLen)
return FALSE;
memcpy(m_pPasswd, szBuf, m_wPasswdLen);
szBuf += m_wPasswdLen;
return TRUE;
}