字节指令的解析

字节指令的格式

字节

字节1

字节2

字节3

字节4

字节5

含义

7F

指令长度

指令码

数据位

校验和

各字节定义如下:

字节1:指令首字节始终为 7FH

字节2:指令长度

字节3:指令码

字节4:校验和

字节5:校验码,为前面的第23字节的算术和的低8位,即算术和对256取模后的结果;

字节5=(字节2+字节3+字节4%256

字节

字节1

字节2

字节3

10字节数组

字节7

含义

7F

01

指令码

时间数据

校验和

各字节定义如下:

字节1:指令首字节始终为 7FH

字节2:指令长度

字节3:指令码

10字节数组:日期数据

字节7:校验码,为前面的第23字节的算术和的低8位,即算术和对256取模后的结果;

字节5=(字节2+字节3+10字节数组)%256

字节

字节1

字节2

字节3

20字节数组

字节7

含义

7F

01

指令码

重命名数据

重设密码

校验和

各字节定义如下:

字节1:指令首字节始终为 7FH

字节2:指令长度

字节3:指令码

20字节数组:wifi名字或密码

字节7:校验码,为前面的第23字节的算术和的低8位,即算术和对256取模后的结果;

字节5=(字节2+字节3+20字节数组)%256

解析

void CClientConnect::ParseByteData(UChar *pBuf, UInt iLen)
{
    for(int i = 0;i < iLen;i++)
    {
        if(0x7F == pBuf[i])
        {
            if(iLen > 1)
            {
                m_iDataLen = pBuf[i+1];
            }
            m_iRemaLen   = iLen-i;
            if(m_iRemaLen < m_iDataLen || m_iRemaLen == 1)
            {
                memcpy(m_pCmdControlBuf,&pBuf[i],m_iRemaLen);
                m_pCmdControlBuf[m_iRemaLen] = 0;
                break;
            }
            UChar *pData = NULL;
            pData = new UChar[m_iDataLen];
            memcpy(pData,&pBuf[i],m_iDataLen);
            if(CheckCode(pData,m_iDataLen))  //检验校验和
            {
                ParseCmdData(pData);         //解析指令
                memset(pData,0,m_iDataLen);
            }
            if(pData)
            {
                delete pData;
                pData = NULL;
            }
            i += (m_iDataLen-1);
            m_iRemaLen = 0;
            m_iDataLen = 0;
            continue;
        }else    //拼接上次接收不完整的指令
        {
            if(m_iRemaLen == 1)
            {
                m_iDataLen = pBuf[0];
            }
            m_pCmdControlBuf[m_iRemaLen] = pBuf[i];
            m_iRemaLen++;
            if(0x7F == m_pCmdControlBuf[0] && CheckCode(m_pCmdControlBuf,m_iDataLen))
            {
                UChar *pData = NULL;
                pData = new UChar[m_iDataLen];
                memcpy(pData,m_pCmdControlBuf,m_iDataLen);
 
                ParseCmdData(pData);
                memset(m_pCmdControlBuf,0,PRO_LEN);
 
                if(pData)
                {
                    delete pData;
                    pData = NULL;
                }
            }
            if(m_iRemaLen == m_iDataLen)
            {
                memset(m_pCmdControlBuf,0,PRO_LEN);
                m_iRemaLen = 0;
                m_iDataLen = 0;
            }
 
        }
    }
}
 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值