zoukankan      html  css  js  c++  java
  • 拼包处理通用函数

    主要是工作用到的,通用的,可能跨应用场合的类或函数

    下面这个主要是用来处理接收对拼包的处理过程:

    //===========================================================================================================
    // Name     :ST_MemData
    // Created    :10:5:2011   11:34
    // Author    :JiQiuBo
    
    // Purpose    :used in netlayer.cpp, when camera sending data to ARM, the netlayer object parse the data package;
    // Modify    :
    //===========================================================================================================
    struct ST_MemData
    {
        BYTE *  m_pData;
        int     m_nLen;                  //当前缓冲区大小
        int     m_nPointPos_DataEnd;     //当前数据指针的结束位置
        int     m_nJPGSize;
        
        ST_MemData()
        {
            m_pData = NULL;
            m_nLen = 0;
            m_nPointPos_DataEnd = 0;
            m_nJPGSize = 0;
        };
        
        ~ST_MemData()
        {
            ReleaseSpace();
        };
        
        bool AllocSpace(int nLen)
        {
            ReleaseSpace();
            
            m_pData = new BYTE[nLen];
            m_nLen = nLen;
            m_nPointPos_DataEnd = 0;
            m_nJPGSize = 0;
    
            return true;
        };
        
        bool ReleaseSpace()
        {
            if( m_pData != NULL )
            {
                delete m_pData;
                m_pData = NULL;
            }
            m_nLen = 0;
            m_nPointPos_DataEnd = 0;
            m_nJPGSize = 0;
    
            return true;
        };
    };
    bool CProtocol::ReceivedIsCompletePackage( LPBYTE lpBuff, DWORD dwSize )
    {
    
        BYTE * pPackData = lpBuff;
        int nPackSize = dwSize;
        
        if (m_oMemData.m_pData == NULL)
        {
            //this->m_oMemData.ReleaseSpace();
            this->m_oMemData.AllocSpace(1024 * 1024 * 2);
        }
        
        if (m_oMemData.m_nPointPos_DataEnd + nPackSize > m_oMemData.m_nLen)
        {
            m_oMemData.m_nPointPos_DataEnd = 0;
            printf("warning! m_nPointPos_DataEnd + nPackSize > m_oMemData.m_nLen =============================\r\n");
        }
        
        m_oMemData.m_nJPGSize = 0;
        
        memcpy(m_oMemData.m_pData + m_oMemData.m_nPointPos_DataEnd, pPackData, nPackSize);
        m_oMemData.m_nPointPos_DataEnd += nPackSize;
        
        BYTE * lpPackageHeader;
        lpPackageHeader = (BYTE *) m_oMemData.m_pData;
        
        
        const int PACK_HEADER_SIZE = CNST_LEGTH_PACKHEADER;
        if (nPackSize < PACK_HEADER_SIZE)
            return nPackSize;
        
        Enthernet_FrameHead framehead; memset( &framehead, 0, sizeof( Enthernet_FrameHead) );
    
        int nJPGDataPos = 0;//PACK_HEADER_SIZE + lpPackageHeader->numberofrecord * sizeof (YhteCarRecordDataStr);
        
        if (lpPackageHeader[0] == 0xaa && lpPackageHeader[1] == 0x55 && 
            lpPackageHeader[2] == 0xaa && lpPackageHeader[3] == 0x55)
        {
            //判断数据的合法性,如头部分信息的合理性,或校验位是否正确
            //从包头中得到数据长度
            DWORD dwDataLen = 0;
            
            memcpy(&framehead,lpPackageHeader+3,2);
            memcpy(&dwDataLen,lpPackageHeader+5,4); //数据包长度
            //wCrcValue=gen_crc(lpPackageHeader+3,6); //求校验值
    
            m_oMemData.m_nJPGSize = dwDataLen;
            nJPGDataPos = PACK_HEADER_SIZE;
    
            /*
            if (lpPackageHeader->numberofrecord < 8 && lpPackageHeader->numberofrecord > 0)
            {
                //接收到头
                m_oMemData.m_nJPGSize = lpPackageHeader->jpgsize;
                nJPGDataPos = PACK_HEADER_SIZE + lpPackageHeader->numberofrecord * sizeof (YhteCarRecordDataStr);
                
                //printf("OK! Find header!==================================================\r\n");
            }
            else
            {
                printf("warning! in package header ,the jlpPackageHeader->numberofrecord,s value is not right!==================================================\r\n");
                
                nJPGDataPos = 0;
                
                //去除该头数据
                if (m_oMemData.m_nPointPos_DataEnd - PACK_HEADER_SIZE >= 0)
                {
                    memmove(m_oMemData.m_pData, m_oMemData.m_pData + PACK_HEADER_SIZE, m_oMemData.m_nPointPos_DataEnd - PACK_HEADER_SIZE);
                    m_oMemData.m_nPointPos_DataEnd = m_oMemData.m_nPointPos_DataEnd - PACK_HEADER_SIZE;
                }
                return m_oMemData.m_nPointPos_DataEnd;
            }
            */
        }
        else
        {
            printf("warning! the 0 pos is not header. Begin find header..................................................\r\n");
            
            bool bFoundHeader = false;
            
            //
            BYTE * pTmpData = m_oMemData.m_pData;
            int noffset = 0;
            while (m_oMemData.m_nPointPos_DataEnd >= m_oMemData.m_nJPGSize + nJPGDataPos + noffset )
            {
                BYTE * lpPackageHeader;
                lpPackageHeader = (BYTE *)( pTmpData + noffset);
                if (lpPackageHeader[0] == 0xaa && lpPackageHeader[1] == 0x55 && 
                    lpPackageHeader[2] == 0xaa && lpPackageHeader[3] == 0x55)
                {
                    //判断数据的合法性,如头部分信息的合理性,或校验位是否正确
                    //if (lpPackageHeader->numberofrecord < 8 && lpPackageHeader->numberofrecord > 0)  //不做过多判断,找到头就认为是正确的
                    {
                        //找到位置
                        memmove(m_oMemData.m_pData, m_oMemData.m_pData + noffset, m_oMemData.m_nPointPos_DataEnd - noffset);
                        m_oMemData.m_nPointPos_DataEnd = m_oMemData.m_nPointPos_DataEnd - noffset;
                        
                        printf("OK! found the header!==================================================\r\n");
                        
                        bFoundHeader = true;
                        break;
                    }
                }
                noffset++;
            }
            
            if( !bFoundHeader )
                return false;
        }
        
        
        if (m_oMemData.m_nJPGSize > 0 && m_oMemData.m_nJPGSize < m_oMemData.m_nLen && m_oMemData.m_nPointPos_DataEnd >= m_oMemData.m_nJPGSize + nJPGDataPos)
        {//一个完整的数据包
            
            /*
            YhteDSPRealDataPackageHeaderStruct * lpPackageHeader2;
            lpPackageHeader2 = (YhteDSPRealDataPackageHeaderStruct *) m_oMemData.m_pData;
            if ( lpPackageHeader2->header != constHeartPackage.header || lpPackageHeader2->check != constHeartPackage.check)
            {
                printf( "warning!  header is not right!======================================================" );
                return m_oMemData.m_nPointPos_DataEnd;
            }
            */
            
            //SaveDataToFile(m_oMemData);
            ParsePackage( m_oMemData.m_pData, m_oMemData.m_nPointPos_DataEnd, framehead );
            
            if (m_oMemData.m_nPointPos_DataEnd - m_oMemData.m_nJPGSize - nJPGDataPos >= 0)
            {
                memmove(m_oMemData.m_pData, m_oMemData.m_pData + m_oMemData.m_nJPGSize + nJPGDataPos, m_oMemData.m_nPointPos_DataEnd - m_oMemData.m_nJPGSize - nJPGDataPos);
                m_oMemData.m_nPointPos_DataEnd = m_oMemData.m_nPointPos_DataEnd - m_oMemData.m_nJPGSize - nJPGDataPos;
            }
            else
            {
                m_oMemData.m_nPointPos_DataEnd = 0;
            }
        }
    }

    这个函数还可进一步完善为模板格式,可以处理各种格式的包头和数据,包头1+信息段+数据等格式。

  • 相关阅读:
    BugkuCtf-pwn2-exp
    Python 基础知识(一)
    C++基本语法的部分总结
    Ububtu 14.04 安装 Hadoop 2.7.3
    leetcode-Evaluate the value of an arithmetic expression in Reverse Polish Notation
    leetcode-Given a binary tree, find its minimum depth
    Java 实现 AES 加解密
    git fork代码并修改胡提交到自己的git仓库
    git使用记录_备忘
    java awt 中文乱码 显示为 方块
  • 原文地址:https://www.cnblogs.com/jiqiubo/p/2450747.html
Copyright © 2011-2022 走看看