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());
}
{
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());
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货