cs程序中的大或小端问题?

时间:2016-12-26 13:23:52

标签: c++ network-programming endianness

我为客户端和服务器制定了协议。如何使SerializeUnSerialize函数解决大端或小端的问题,以满足跨平台的可移植性。

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];
};

和我的SerializeUnSerialize功能如下

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;
}

0 个答案:

没有答案