class CFrame  
{
public:
INT8U RevertFrame(INT8U* PSrc,INT8U Count);
void CreateFrame(const INT8U* pSrc,INT8U Count, INT8U NewParam);
INT8U GetXORByte(void);
void EnCode(INT8U NewParam);
void DeCode(INT8U NewParam);
unsigned char m_Count;
CFrame();
virtual ~CFrame(); void CreateConnectOrder(void);
INT8U m_Buf[256];private:

unsigned char m_ParamLastGet,m_ParamLastSend;
};
static const unsigned char ComXORMap[] = { 0x0b,0x01,0x00,0x08,0x04,0x02,0x01,0x0f,
0x0e,0x07,0x09,0x0a,0x02,0x0d,0x0c,0x03 };CFrame::CFrame()
{
    m_Count = 0;
    m_ParamLastGet = m_ParamLastSend = 0;
}CFrame::~CFrame()
{}void CFrame::DeCode(INT8U Param)
{
    INT8U Tmp =  Param & 0x0f;

for ( INT8U i = 1; i < m_Count-1; i++ )
{
    m_Buf[i] ^= ComXORMap[Tmp];
Tmp++;
Tmp &= 0x0f;

}void CFrame::EnCode(INT8U NewParam)
{
    DeCode(NewParam);    
}INT8U CFrame::GetXORByte()
{
//此时m_Buf[0]     : FRAME_SATRT
//此时m_Buf[1]     :  ORDER
//此时m_Buf[2]     :  Dat1
//....
//m_Buf[m_Count-3] :  Datn
//m_Buf[m_Count-2] :  XOR
//m_Buf[m_Count-1] :  PARAM
//m_Buf[m_Count]   :  FRAME_END      INT8U XOR = 0;    for (INT8U i = 1; i<(m_Count-2); i++)
        XOR ^= m_Buf[i];      
   
    return XOR;
}void CFrame::CreateFrame(const INT8U* pSrc, INT8U Count, INT8U NewParam)
{
// pSrc ->     ORDER + Dat1 +... + Datn//此时m_Buf[0]     : FRAME_SATRT
//此时m_Buf[1]     :  ORDER
//此时m_Buf[2]     :  Dat1
//....
//m_Buf[m_Count-3] :  Datn
//m_Buf[m_Count-2] :  XOR
//m_Buf[m_Count-1] :  PARAM
//m_Buf[m_Count]   :  FRAME_END
    NewParam &= 0x0f;
m_ParamLastSend = NewParam;
m_Count = Count + 3;
    m_Buf[0] = FRAME_SATRT;
    m_Buf[m_Count] = FRAME_END;
m_Buf[m_Count - 1] = NewParam;
memcpy((void *)&m_Buf[1],(const void*)pSrc,Count);
    m_Buf[m_Count - 2] = GetXORByte();
EnCode(m_ParamLastGet+NewParam);
//m_ParamLastGet = NewParam;  
}
INT8U CFrame::RevertFrame(INT8U* pSrc, INT8U Count)
{
// pSrc ->     FRAME_SATRT + ORDER + Dat1 +... + Datn + XOR + PARAM + FRAME_END
//此时m_Buf[0]     : FRAME_SATRT
//此时m_Buf[1]     :  ORDER
//此时m_Buf[2]     :  Dat1
//....
//m_Buf[m_Count-3] :  Datn
//m_Buf[m_Count-2] :  XOR
//m_Buf[m_Count-1] :  PARAM
//m_Buf[m_Count]   :  FRAME_END
    m_Count = Count-1; memcpy((void *)&m_Buf[0],(const void*)pSrc,Count);
m_ParamLastGet = m_Buf[m_Count-1];
DeCode(m_ParamLastSend+m_Buf[m_Count-1]);
if ( m_Buf[m_Count - 2] != GetXORByte() )
{
return false;
}
else
{
return true;
}

}void CFrame::CreateConnectOrder(void)
{
//此时m_Buf[0]     : FRAME_SATRT
//此时m_Buf[1]     :  ORDER
//此时m_Buf[2]     :  Dat1
//....
//m_Buf[m_Count-3] :  Datn
//m_Buf[m_Count-2] :  XOR
//m_Buf[m_Count-1] :  PARAM
//m_Buf[m_Count]   :  FRAME_END
static const INT8U Sample[] = { ORDER_CONNECT };
CTime t = CTime::GetCurrentTime();   
    CreateFrame(Sample,sizeof(Sample),t.GetSecond());