解析信令的类

2023-12-11 22:59
文章标签 解析 信令

本文主要是介绍解析信令的类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. // XmlParser.cpp: implementation of the CXmlParser class.
  2. //
  3. //
  4. #include "stdafx.h"
  5. //#include "zxc.h"
  6. #include "XmlParser.h"
  7. #include <cassert>
  8. //
  9. // Construction/Destruction
  10. //
  11. inline BYTE MakeByte(BYTE b1, BYTE b2)
  12. {//高半字节放在b1,低半字节放在b2
  13.     BYTE b = b1 << 4;
  14.     //  b <<= 4;
  15.     b |= b2 & 0x0f;
  16.     return b;
  17. }
  18. inline WORD MakeWord(BYTE b1, BYTE b2)
  19. {
  20.     //WORD w = b1;
  21.     //w <<= 8;
  22.     WORD w = b1 << 8;
  23.     w |= b2;
  24.     return w;
  25. }
  26. inline DWORD MakeDWord(BYTE b1, BYTE b2, BYTE b3, BYTE b4)
  27. {
  28.     DWORD d = b1 << 24;
  29.     //  d <<= 24;
  30.     d |= (b2 << 16);
  31.     d |= (b3 << 8);
  32.     d |= b4;
  33.     return d;
  34. }
  35. DWORD GetBits(BYTE *src, size_t pos, size_t len)
  36. {
  37.     assert( len <= 32);
  38.     DWORD t;
  39.     BYTE *p = src + pos/8;
  40.     t = MakeDWord(*p, *(p+1), *(p+2), *(p+3));
  41.     //  std::cout << "word:" << std::hex << t << std::endl;
  42.     if (pos % 8 + len > 32)
  43.     {//跨度超过4个字节
  44.         DWORD b = -1;
  45.         b >>= pos % 8; // 0x0..0FFFFF
  46.         t &= b;//清除左边无效位
  47.         t <<= (pos + len) % 8;//合适的位置,低位补0
  48.         DWORD t1 = *(p + 4) >> (8 - (pos + len) % 8);//第5个字节的有效位
  49.         t |= t1;
  50.         return t;
  51.     }
  52.     DWORD n = sizeof( t);
  53.     DWORD b =  (n<<3) - pos%8 - len;// - 1;
  54.     t >>= b;
  55.     //  std::cout << "right shift: " << std::hex << t << std::endl;
  56.     DWORD x = -1;
  57.     //  std::cout << "-1/0xff...:" << std::hex << x << std::endl;
  58.     x ^= x << len;
  59.     //  std::cout << "mask: " << std::hex << x << std::endl;
  60.     t &= x;
  61.     //src += (pos + len) / 8;
  62.     pos += len;
  63.     return t;
  64. }
  65. CXmlParser::CXmlParser()
  66. {
  67.     m_pXmlDoc = 0;
  68. //  ::CoInitialize(NULL);
  69.     
  70.     HRESULT hr = m_pXmlDoc.CreateInstance(__uuidof(DOMDocument40));
  71.     if(FAILED(hr))
  72.         throw L"failed to create DOM DOC";  
  73. }
  74. CXmlParser::~CXmlParser()
  75. {
  76. //  ::CoUninitialize();//有这句会出错,不知道为什么
  77. }
  78. BOOL CXmlParser::LoadXml(const CString& strXml)
  79. {//XML文件中不要加注释,保存为unicode格式,里面不要写汉语
  80.     if (m_strXml == strXml)
  81.         return TRUE;
  82.     m_strXml = strXml;
  83.     return m_pXmlDoc->load(_variant_t(strXml));
  84. }
  85. inline BOOL CXmlParser::IsGotaBurst(BYTE src[], size_t len)
  86. {
  87.     if (len < 3) return FALSE;
  88.     return (*src == 0) && (src[1] == 0) && (src[2] = 0x3c);
  89. }
  90. MSXML2::IXMLDOMElementPtr CXmlParser::GetFirstChildByID(const MSXML2::IXMLDOMElementPtr& pElement, int id) const
  91. {
  92.     MSXML2::IXMLDOMElementPtr pChild = pElement->GetfirstChild(), pTemp = NULL;
  93.     MSXML2::IXMLDOMAttributePtr pAttr = NULL;
  94.     while (pChild != NULL)
  95.     {
  96.         pAttr = pChild->getAttributeNode(L"id");
  97.         if (pAttr == NULL)//每一个子节点都必须有id属性
  98.         {
  99.             wcout << L"wrong. the item doesn't has id attribute." << endl;
  100.             return NULL;
  101.         }
  102.         _bstr_t text = pAttr->Gettext();
  103.         if (_wtoi((LPCTSTR)text) == id)
  104.         {
  105.             return pChild;
  106.         }
  107.         pTemp = pChild->GetnextSibling();
  108.         swap(pChild, pTemp);
  109.     }
  110. #ifdef _DEBUG
  111.     wcout << L"can not find the corresponding child with the specified id" << endl;
  112. #endif
  113.     return NULL;
  114. }
  115. MSXML2::IXMLDOMNodePtr CXmlParser::GetFirstChildByID(const MSXML2::IXMLDOMNodePtr& pFather, const CString &strID) const
  116. {
  117.     MSXML2::IXMLDOMNodePtr pChild = NULL, pTemp = NULL, pAttr = NULL;
  118.     MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
  119.     BSTR text;
  120.     if (pFather == NULL)
  121.     {
  122.         return NULL;
  123.     }
  124.     pChild = pFather->firstChild;
  125.     while (pChild)
  126.     {
  127.         pAttrs = pChild->attributes;
  128.         if (pAttrs == NULL)
  129.         {
  130.             return NULL;
  131.         }
  132.         pAttr = pAttrs->nextNode();
  133.         if (pAttr == NULL)
  134.             return NULL;
  135.         text = pAttr->text;
  136.         if (strID == (LPCTSTR)((_bstr_t)text))
  137.         {
  138.             return pChild;
  139.         }
  140.         pTemp = pChild->nextSibling;
  141.         swap(pChild, pTemp);
  142.     }
  143.     return NULL;
  144. }
  145. bool CXmlParser::ParseMessage(const MSXML2::IXMLDOMElementPtr& pChannel)
  146. {
  147.     MSXML2::IXMLDOMElementPtr pMsg, pChild, pTemp;
  148.     MSXML2::IXMLDOMAttributePtr pAttr;
  149.     int msgID = static_cast<int>(m_aRawData[0]);
  150.     if (msgID <= 0)
  151.     {
  152.         wcout << L"wrong message id in the raw data" << endl;
  153.         return false;
  154.     }
  155.     pMsg = GetFirstChildByID(pChannel, msgID);
  156.     if (pMsg == NULL)
  157.     {
  158.         wcout << L"can not find the message item with the specified id" << endl;
  159.         return false;
  160.     }
  161.     m_nPos += 8;//first byte if message id.
  162.     _bstr_t msgName;
  163.     pAttr = pMsg->getAttributeNode(L"name");
  164.     if (pAttr != NULL)
  165.     {
  166.         msgName = pAttr->Gettext();
  167.         m_strInfo += (LPCTSTR)msgName;
  168.         m_strInfo += L"/n";
  169.     }
  170.     else
  171.     {
  172.         wcout << L"can not get message name." << endl;
  173.         return false;
  174.     }
  175.     pAttr = pMsg->getAttributeNode(L"summary");
  176.     if (pAttr != NULL)
  177.     {
  178.         _bstr_t text = pAttr->Gettext();
  179.         if (wstring(L"true") == (LPCTSTR)text)
  180.             m_strSummary = (LPCTSTR)msgName;
  181.     }
  182.     else
  183.     {
  184.         wcout << L"do not has summary attribute" << endl;
  185.     }
  186.     pChild = pMsg->GetfirstChild();
  187.     while (pChild != NULL)
  188.     {
  189.         int nParsed = ParseXmlElement(pChild);
  190.         if (nParsed < 0)
  191.         {
  192.             wcout << L"parsed error, exit from ParseMessage" << endl;
  193.             return false;
  194.         }
  195.         pTemp = pChild->GetnextSibling();
  196.         swap(pTemp, pChild);
  197.     }
  198.     return false;
  199. }
  200. //解析实际数据,不包括ID,len
  201. BOOL CXmlParser::ParseMessage(const MSXML2::IXMLDOMNodePtr& pChannel)
  202. {
  203.     MSXML2::IXMLDOMNodeListPtr pChildren = NULL;
  204.     MSXML2::IXMLDOMNodePtr pMsg = NULL, pChild = NULL, pAttr1 = NULL, pAttr2 = NULL, pAttr3 = NULL;
  205.     MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
  206.     try
  207.     {
  208. //      pMsgList = pChannel->childNodes;
  209.         CString strID;
  210.         strID.Format(L"%d", m_aRawData[0]);
  211.         pMsg = GetFirstChildByID(pChannel, strID);//对于GOTA的db消息,是找到db下的合适的子消息
  212.         if (pMsg == NULL)//没有找到符合ID的消息
  213.             return FALSE;
  214.         m_aRawData++;
  215.         m_nRemaine -= 8;
  216.         pAttrs = pMsg->attributes;
  217.         pAttrs->nextNode();//忽略第一个属性 (ID)
  218.         pAttr2 = pAttrs->nextNode();
  219.         BSTR msgName = pAttr2->text;
  220.         m_strInfo += (LPCTSTR)_bstr_t(msgName);
  221.         m_strInfo += L"/n";
  222.         pAttr3 = pAttrs->nextNode();
  223.         BSTR text = pAttr3->text;
  224.         if (wstring(L"true") == (LPCTSTR)(_bstr_t)text)
  225.             m_strSummary = (LPCTSTR)(_bstr_t)msgName;
  226.         pChildren = pMsg->childNodes;
  227.         m_nPos = 0;//important!
  228.         while ((pChild = pChildren->nextNode()) != NULL)
  229.         {
  230.         //  BSTR s;
  231.         //  s = pChild->Gettext();
  232.         //  wcout << (TCHAR *)(_bstr_t)text << endl;
  233.             int len = ParseXmlNode(pChild);
  234.             //m_nRemaine -= len;
  235.         }
  236. //      wcout << L"m_strInfo: " << (LPCTSTR)m_strInfo << endl;
  237.     }
  238.     catch(const CString& str)
  239.     {
  240.         wcout << L"error: " << str << endl;
  241.     }
  242.     return TRUE;
  243. }
  244. BOOL CXmlParser::ParseDBMessage(const MSXML2::IXMLDOMNodePtr &pMsg)
  245. {
  246.     MSXML2::IXMLDOMNodeListPtr pChildren = NULL;
  247.     MSXML2::IXMLDOMNodePtr pChild = NULL, pAttr1 = NULL, pAttr2 = NULL, pAttr3 = NULL;
  248.     MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
  249.     pAttrs = pMsg->attributes;
  250.     pAttrs->nextNode();//忽略第一个属性
  251.     pAttr2 = pAttrs->nextNode();//消息名
  252.     BSTR msgName = pAttr2->text;
  253.     m_strInfo += (LPCTSTR)_bstr_t(msgName);// L"/n";
  254.     m_strInfo += L"/n";
  255.     pAttr3 = pAttrs->nextNode();
  256.     BSTR text = pAttr3->text;
  257.     if (wstring(L"true") == (LPCTSTR)(_bstr_t)text)
  258.         m_strSummary = (LPCTSTR)(_bstr_t)msgName;
  259.     pChildren = pMsg->childNodes;
  260.     m_nPos = 0;//important!
  261.     while ((pChild = pChildren->nextNode()) != NULL)
  262.     {
  263.         BSTR s;
  264.         s = pChild->Gettext();
  265.     //  wcout << (TCHAR *)(_bstr_t)text << endl;
  266.         m_nRemaine -= ParseXmlNode(pChild);
  267.     }
  268.     wcout << L"m_strInfo: " << (LPCTSTR)m_strInfo << endl;
  269.     return FALSE;
  270. }
  271. BOOL CXmlParser::ParseData(BYTE src[], size_t len, int nChannelID)
  272. {
  273.     Reset();
  274.     MSXML2::IXMLDOMElementPtr pRoot = m_pXmlDoc->GetdocumentElement();
  275.     MSXML2::IXMLDOMElementPtr pChannel = GetFirstChildByID(pRoot, nChannelID);
  276.     if (pRoot == NULL)
  277.     {
  278.         return FALSE;
  279.     }
  280.     if (*src != len)//第一个字节(后面数据的)是长度
  281.     {
  282.         return FALSE;
  283.     }
  284.     m_aRawData = src + 1;
  285.     m_nDataLength = (len - 1) * 8;
  286.     if (ParseMessage(pChannel))
  287.         return TRUE;
  288.     return TRUE;
  289. }
  290. BOOL CXmlParser::ParseData(BYTE src[], size_t len, const CString& strChannelID)
  291. {
  292.     Reset();//清理上次解析时的设置的变量
  293.     MSXML2::IXMLDOMNodePtr pRoot = m_pXmlDoc->firstChild;
  294.     MSXML2::IXMLDOMNodePtr pChannel = GetFirstChildByID(pRoot, strChannelID);
  295.     BSTR text = pChannel->baseName;
  296. //  wcout << (TCHAR *)(_bstr_t)text << endl;
  297.     if (*src != len)// that's right, the len is the len of the raw data(contains it self)包括自己在内的字节的个数
  298.     {
  299.         return FALSE;
  300.     }
  301.     m_aRawData = src + 1;//length
  302. //  m_nPos += 8;
  303.     /*size_t */m_nRemaine = len - 1;
  304.     m_nDataLength = m_nRemaine * 8;
  305.     m_nRemaine = m_nDataLength;
  306.     ParseMessage(pChannel);
  307.     return TRUE;
  308. }
  309. int CXmlParser::ParseXmlNode(const MSXML2::IXMLDOMNodePtr &pNode)
  310. {
  311.     int nParsed = 0;
  312.     MSXML2::IXMLDOMNodeListPtr pChildren;
  313.     MSXML2::IXMLDOMNodePtr pChild, pAtt1, pAtt2, pAtt3, pAtt4;
  314.     MSXML2::IXMLDOMNamedNodeMapPtr pAttrs;
  315.     BSTR text;
  316.     int d;
  317.     pNode->get_baseName(&text);//得到节点名称
  318.     if (wstring(L"_") == (wchar_t*)((_bstr_t)text))//如果是控制节点
  319.     {
  320.         pNode->get_attributes(&pAttrs);//属性
  321.         pAtt1= pAttrs->nextNode();//第一个属性节点
  322.         pAtt1->get_text(&text);
  323.         long l = _wtoi((_bstr_t)text);//, pos;//所依赖的节点的位置
  324.         size_t xc = m_vdwData.size();
  325.         if (xc + l >= xc)
  326.         {
  327.             wcerr << L"error" << endl;
  328.             return 0;
  329.         }
  330.         d = m_vdwData[m_vdwData.size() + l];
  331.         pAtt2=pAttrs->nextNode();
  332.         pAtt2->get_text(&text);//第二个属性的值
  333.         pNode->get_childNodes(&pChildren);
  334.         
  335.         if (wstring(L"is") == (wchar_t *)((_bstr_t)text))
  336.         {
  337.             pAtt3 = pAttrs->nextNode();
  338.             pAtt3->get_text(&text);//第三个属性的值
  339.             if (d == _wtoi((_bstr_t)text))
  340.             {//有子项
  341.                 pNode->get_childNodes(&pChildren);
  342.                 while ((pChild = pChildren->nextNode()) != NULL)
  343.                 {//处理每个子项
  344.                     nParsed += ParseXmlNode(pChild);
  345.                 }
  346.             }
  347.             else
  348.             {
  349.                 //没有子项
  350.             }
  351.         }
  352.         else if (wstring(L"has") == (wchar_t *)((_bstr_t)text))
  353.         {
  354.             if (d & _wtoi((_bstr_t)text))//wrong!!!!
  355.             {//有子项
  356.                 pNode->get_childNodes(&pChildren);
  357.                 while ((pChild = pChildren->nextNode()) != NULL)
  358.                 {
  359.                     nParsed += ParseXmlNode(pChild);
  360.                 }
  361.             }
  362.             else
  363.             {//没有子项
  364.             }
  365.         }
  366.         else if (wstring(L"len") == (wchar_t *)((_bstr_t)text))
  367.         {
  368.             if (nParsed >= d)
  369.                 return nParsed;
  370.             long nChildren;
  371.             pChildren->get_length(&nChildren);
  372.             if (nChildren == 0)
  373.             {//没有子项,则直接输出剩余的数据,并返回
  374.                 wostringstream wos;
  375.                 
  376.                 //得到长度单位
  377.                 pAtt3 = pAttrs->nextNode();
  378.                 pAtt3->get_text(&text);
  379. //              wcout << (LPCTSTR)(_bstr_t)text << endl;
  380.                 int unit = _wtoi((_bstr_t)text);
  381.                 if (unit < 0)
  382.                     d = m_nRemaine;
  383.                 else
  384.                     d *= unit;
  385.                 //长度单位
  386.                 pAtt4 = pAttrs->nextNode();
  387.                 
  388.                 wos << (LPCTSTR)(_bstr_t)pAtt4->text << L" = ";
  389.                 unsigned long ul;
  390.                 for (int i = 0; i < d/8; i++)
  391.                 {
  392.                     ul = GetBits(m_aRawData, m_nPos, 8);
  393.                     wos << hex << L"0x" << ul << L" ";
  394.                     m_nPos += 8;
  395.                 }
  396.                 if (d % 8)
  397.                 {
  398.                     ul = GetBits(m_aRawData, m_nPos, d % 8);
  399.                     wos << hex << L"0x" << ul << endl;
  400.                 }
  401.                 /*for (int i = 0; i < d; i++)
  402.                 {
  403.                     ul = GetBits(m_aRawData, m_nPos, 8);
  404.                     wos << hex << L"0x" << ul << L" ";
  405.                     m_nPos += 8;
  406.                 }*/
  407.                 m_strInfo += wos.str().c_str();
  408.                 m_strInfo += L"/n";
  409.                 nParsed += d;
  410.                 m_nRemaine -= d;
  411.                 return nParsed;
  412.             }
  413.             pNode->get_childNodes(&pChildren);
  414.             while ((pChild = pChildren->nextNode()) != NULL)
  415.             {
  416.                 nParsed += ParseXmlNode(pChild);
  417.             }
  418.         }
  419.         else if (wstring(L"recur") == (wchar_t *)((_bstr_t)text))
  420.         {
  421.             pAtt3 = pAttrs->nextNode();
  422.             pAtt3->get_text(&text);
  423. //          wcout << (LPCTSTR)(_bstr_t)text << endl;
  424.             int unit = _wtoi((_bstr_t)text);
  425.             if (unit < 0)
  426.                 d = m_nRemaine;
  427.             else
  428.                 d *= unit;
  429.             MSXML2::IXMLDOMNodePtr pTemp, pFirst;
  430.             pFirst = pChildren->nextNode();
  431.             while (d > nParsed)
  432.             {
  433. //              wcout << (LPCTSTR)(_bstr_t)pNode->baseName << endl;
  434.                 pChild = pFirst;
  435.                 while (pChild != NULL)
  436.                 {
  437. //                  wcout << (LPCTSTR)(_bstr_t)pChild->baseName << endl;
  438.                     nParsed += ParseXmlNode(pChild);
  439.                     pTemp = pChild->nextSibling;
  440.                     swap(pTemp, pChild);
  441.                 }
  442.             }
  443.         }
  444.         //if (m_vdwData.size() > 1)
  445.         //  m_vdwData.pop_back();
  446.         return nParsed;
  447.     }
  448.     pNode->get_attributes(&pAttrs);
  449.     pAtt1 = pAttrs->nextNode();
  450.     pAtt1->get_baseName(&text);
  451.     pAtt1->get_text(&text);
  452.     int n = _wtoi((TCHAR *)(_bstr_t)text);
  453.     if (n + m_nPos > m_nDataLength)
  454.     {//如果长度不匹配,则出错
  455.         wcerr << L"error data length" << endl;
  456.         return -1;
  457.     }
  458.     DWORD x = GetBits(m_aRawData, m_nPos, n);
  459.     
  460.     m_nPos += n;
  461.     nParsed += n;
  462.     m_nRemaine -= n;
  463.     pAtt2 = pAttrs->nextNode();
  464.     pAtt2->get_text(&text);//name
  465.     wostringstream ostr;
  466.     ostr << (TCHAR *)((_bstr_t)text) << L" = " << /*m_vdwData[m_vdwData.size() -1]*/ x << endl;//name = dword
  467.     m_strInfo += ostr.str().c_str();
  468. //  wcout << (LPCTSTR)m_strInfo << endl;
  469.     pAtt3 = pAttrs->nextNode();
  470.     if (pAtt3 == NULL)//第3个属性不存在
  471.         return nParsed;
  472.     pAtt3->get_text(&text);//第三个属性为"save"
  473.     if (wstring(L"true") == (LPCTSTR)((_bstr_t)text))
  474.         m_vdwData.push_back(x);
  475.     return nParsed;
  476. }
  477. int CXmlParser::ParseXmlElement(const MSXML2::IXMLDOMElementPtr& pElement)
  478. {
  479.     int nParsed = 0;
  480.     MSXML2::IXMLDOMNodeListPtr pChildren;
  481.     MSXML2::IXMLDOMElementPtr pChild;
  482.     MSXML2::IXMLDOMNamedNodeMapPtr pAttrs;
  483.     MSXML2::IXMLDOMAttributePtr /*pAttr, */pAttr1, pAttr2, pAttr3, pAttr4;
  484.     _bstr_t text = pElement->baseName;
  485.     if (wstring(L"_") == (wchar_t *)text)
  486.     {
  487.         pAttr1 = pElement->getAttributeNode(L"de");
  488.         text = pAttr1->Getvalue();
  489.         int nBack = _wtoi((LPCTSTR)text);
  490.         int nvlen = static_cast<int>(m_vdwData.size());//避免有符号正数与无符号负数相加时出错
  491.         if (nvlen + nBack >= nvlen)
  492.         {
  493. #if _DEBUG
  494.             wcerr << L"error on _ element's /"de/" attribute" << endl;
  495. #endif
  496.             return -1;
  497.         }
  498.         int nDepend = m_vdwData[nvlen + nBack];
  499.         pAttr2 = pElement->getAttributeNode(L"be");
  500.         text = pAttr2->Getvalue();
  501.         if (wstring(L"is") == (wchar_t *)text)
  502.         {
  503.             pAttr3 = pElement->getAttributeNode(L"dval");
  504.             text = pAttr3->Gettext();
  505.             if (nDepend == _wtoi((LPCTSTR)text))
  506.             {
  507.                 pChildren = pElement->GetchildNodes();
  508.                 while ((pChild = pChildren->nextNode()) != NULL)
  509.                 {
  510.                     int ix = ParseXmlElement(static_cast<MSXML2::IXMLDOMElementPtr>(pChild));
  511.                     if (ix < 0)
  512.                     {
  513.                         wcout << L"error when parse, exit from ParseXmlElement().." << endl;
  514.                         return -1;
  515.                     }
  516.                     nParsed += ix;
  517.                 }
  518.             }
  519.         }
  520.         else if (wstring(L"has") == (wchar_t *)text)
  521.         {//此块要重写!
  522.             //if (nDepend )
  523.         }
  524.         else if (wstring(L"len") == (wchar_t *)text)
  525.         {
  526.             pChildren = pElement->GetchildNodes();
  527.             if (pChildren->Getlength() == 0)
  528.             {//没有子项,不保存,不会发生需要弹栈现象
  529.                 wostringstream wos;
  530.                 pAttr3 = pElement->getAttributeNode(L"dval");//长度单位
  531.                 text = pAttr3->Gettext();
  532.                 int unit = _wtoi((LPCTSTR)text);
  533.                 if (unit > 0)
  534.                 {
  535.                     nDepend *= unit;
  536.                 }
  537.                 else if (unit < 0)
  538.                 {
  539.                     nDepend = m_nDataLength - m_nPos;//剩余数据
  540.                     if (nDepend <= 0)
  541.                     {
  542.                         wcout << L"no data exit from ParseXmlElement...len" << endl;
  543.                         return -1;
  544.                     }
  545.                 }
  546.                 else
  547.                 {
  548. #ifdef _DEBUG
  549.                     wcout << L"dval should not be negative." << endl;
  550. #endif
  551.                     return -1;
  552.                 }
  553.                 pAttr4 = pElement->getAttributeNode(L"name");
  554.                 if (pAttr4 == NULL)
  555.                 {//没有子项,则一定有name属性
  556. #ifdef _DEBUG
  557.                     wcout << L"name attribute not exist." << endl;
  558. #endif
  559.                     return -1;
  560.                 }
  561.                 text = pAttr4->Gettext();
  562.                 wos << (LPCTSTR)text << L" = ";
  563.                 for (int i = 0; i < nDepend / 8; i++)
  564.                 {
  565.                     int r = GetBits(m_aRawData, m_nPos, 8);
  566.                     wos << hex << L"0x" << r << L" ";
  567.                     m_nPos += 8;
  568.                 }
  569.                 if (nDepend % 8)
  570.                 {
  571.                     int r = GetBits(m_aRawData, m_nPos, nDepend % 8);
  572.                     wos << hex << L"0x" << r << endl;
  573.                     m_nPos += nDepend % 8;
  574.                 }
  575.                 m_strInfo += wos.str().c_str();
  576.                 m_strInfo += L"/n";
  577.                 nParsed += nDepend;
  578.                 if (m_nPos > m_nDataLength)
  579.                 {
  580.                     wcout << L"fatal error...exit from ParseXmlElement...len." << endl;
  581.                     return -1;
  582.                 }
  583.             }
  584.             else
  585.             {
  586.                 pAttr3 = pElement->getAttributeNode(L"dval");//长度单位
  587.                 text = pAttr3->Gettext();
  588.                 int unit = _wtoi((LPCTSTR)text);
  589.                 if (unit > 0)
  590.                 {
  591.                     nDepend *= unit;
  592.                 }
  593.                 else if (unit < 0)
  594.                 {
  595.                     nDepend = m_nDataLength - m_nPos;//剩余数据
  596.                 }
  597.                 else
  598.                 {
  599. #ifdef _DEBUG
  600.                     wcout << L"dval should not be negative." << endl;
  601. #endif
  602.                     return -1;
  603.                 }
  604.                 while ((pChild = pChildren->nextNode()) != NULL && nParsed < nDepend)
  605.                 {
  606.                     int ix = ParseXmlElement(static_cast<MSXML2::IXMLDOMElementPtr>(pChild));
  607.                     if (ix < 0)
  608.                     {
  609.                         wcout << L"error when parse, exit from ParseXmlElement()...len" << endl;
  610.                         return -1;
  611.                     }
  612.                     nParsed += ix;
  613.                 }
  614.             }
  615.         }
  616.         else if (wstring(L"recur") == (wchar_t *)text)
  617.         {
  618.             pAttr3 = pElement->getAttributeNode(L"dval");
  619.             if (pAttr3 == NULL)
  620.             {
  621.                 return -1;
  622.             }
  623.             text = pAttr3->Gettext();
  624.             int unit = _wtoi((LPCTSTR)text);
  625.             if (unit > 0)
  626.             {
  627.                 nDepend *= unit;
  628.             }
  629.             else if (unit < 0)
  630.             {
  631.                 nDepend = m_nDataLength - m_nPos;//剩余数据
  632.             }
  633.             else
  634.             {
  635. #ifdef _DEBUG
  636.                 wcout << L"dval should not be negative except -1." << endl;
  637. #endif
  638.                 return -1;
  639.             }
  640.             MSXML2::IXMLDOMElementPtr pTemp, pFirst;
  641.             pChildren = pElement->GetchildNodes();
  642.             if (pChildren == NULL || pChildren->Getlength() == 0)
  643.             {
  644. #ifdef _DEBUG
  645.                 wcout << L"recur not have children." << endl;
  646. #endif
  647.                 return -1;
  648.             }
  649.             //pFirst = pChildren->nextNode();
  650.             while (nDepend > nParsed)
  651.             {
  652.                 //pChild = pFirst;
  653.                 pChild = pElement->GetfirstChild();
  654.                 while(pChild != NULL)
  655.                 {
  656.                     int ix = ParseXmlElement(static_cast<MSXML2::IXMLDOMElementPtr>(pChild));
  657.                     if (ix < 0)
  658.                     {
  659.                         wcout << L"error when parse, exit from ParseXmlElement()..--recur " << endl;
  660.                         return -1;
  661.                     }
  662.                     if (m_nPos > m_nDataLength)
  663.                     {
  664.                         wcout << L"fatal error....exit from ParseXmlElement()..--recur" << endl;
  665.                         return -1;
  666.                     }
  667.                     nParsed += ix;
  668.                     pTemp = pChild->GetnextSibling();
  669.                     swap(pTemp, pChild);
  670.                 }
  671.             }
  672.         }
  673.         else
  674.         {
  675. #ifdef _DEBUG
  676.             wcerr << L"error on _ element's second attribute" << endl;
  677. #endif
  678.             return -1;
  679.         }
  680.         //对于len 元素,应是pAttr5
  681.         if ((pAttr4 = pElement->getAttributeNode(L"del")) != NULL)
  682.         {//弹栈
  683.             m_vdwData.pop_back();
  684.         }
  685. #ifdef _DEBUG
  686.         else
  687.         {//不是错误
  688.             wcout << L"del attri not exist." << endl;
  689.         }
  690. #endif
  691.         return nParsed;
  692.     }
  693.     pAttr1 = pElement->getAttributeNode(L"length");
  694.     pAttr2 = pElement->getAttributeNode(L"name");
  695.     pAttr3 = pElement->getAttributeNode(L"save");
  696.     if (pAttr1 == NULL)
  697.     {
  698. #ifdef _DEBUG
  699.         wcerr << L"error xml no length attribute" << endl;
  700. #endif
  701.         return -1;
  702.     }
  703.     if (pAttr2 == NULL)
  704.     {
  705. #ifdef _DEBUG
  706.         wcerr << L"error xml element no name attribute" << endl;
  707. #endif
  708.         return -1;
  709.     }
  710.     text = pAttr1->Getvalue();
  711.     int nLength = _wtoi((wchar_t *)text);
  712.     if (nLength + m_nPos > m_nDataLength)
  713.     {
  714. #ifdef _DEBUG
  715.         wcerr << L"error data length..." << endl;
  716. #endif
  717.         return -1;
  718.     }
  719.     wostringstream ostrData, ostr;
  720.     DWORD data;
  721.     if (nLength > 32)
  722.     {
  723.         for (int i = 0; i < nLength; )
  724.         {
  725.             data = GetBits(m_aRawData, m_nPos, 8);
  726.             ostrData << hex << L"0x" << data << L" ";// << endl;
  727.             m_nPos += 8;
  728.             i += 8;
  729.         }
  730.         if (nLength % 8 != 0)
  731.         {
  732.             data = GetBits(m_aRawData, m_nPos, nLength % 8);
  733.             ostrData << hex << L"0x" << data << endl;
  734.             m_nPos += nLength % 8;
  735.         }
  736.     }
  737.     else
  738.     {
  739.         data = GetBits(m_aRawData, m_nPos, nLength);
  740.         ostrData << dec << data << L"( 0x" << hex << data << L" )";// << endl;
  741.         m_nPos += nLength;
  742.     }
  743.     text = pAttr2->Getvalue();
  744.     ostr << (LPCTSTR)text << L" = " << ostrData.str() << endl;
  745.     m_strInfo += ostr.str().c_str();
  746. #ifdef _DEBUG
  747. //  wcout << (LPCTSTR)m_strInfo;
  748. #endif
  749.     if (pAttr3 != NULL && wstring(L"true") == (LPCTSTR)(_bstr_t)pAttr3->Getvalue())
  750.     {
  751.         m_vdwData.push_back(data);
  752.     }
  753.     nParsed = nLength;
  754.     return nParsed;
  755. }
  756. bool CXmlParser::ParseDataBurst(BYTE src[], size_t len, int nChannelID, int nMsgID)
  757. {//ID, len, data...其中len不包括自身
  758.     if (!IsGotaBurst(src, len))
  759.     {
  760.         wcout << L"the data burst does not contain the gota msg." << endl;
  761.         return false;
  762.     }
  763.     
  764.     Reset();
  765.     MSXML2::IXMLDOMElementPtr pRoot = m_pXmlDoc->GetdocumentElement();
  766.     if (pRoot == NULL)
  767.     {
  768.         wcout << L"can not find the root element of the xml doc" << endl;
  769.         return false;
  770.     }
  771.     MSXML2::IXMLDOMElementPtr pChannel = GetFirstChildByID(pRoot, nChannelID);
  772.     if (pChannel == NULL)
  773.     {
  774.         wcout << L"can not get the channel with the specified channel id" << endl;
  775.         return false;
  776.     }
  777.     MSXML2::IXMLDOMElementPtr pMsg = GetFirstChildByID(pChannel, nMsgID);
  778.     if (pMsg == NULL)
  779.     {
  780.         wcout << L"can not get message node with the specified msg id" << endl;
  781.         return false;
  782.     }
  783.     m_aRawData = src + 3;
  784.     m_nDataLength = (len - 3) * 8;
  785.     return ParseMessage(pMsg);
  786. }
  787. BOOL CXmlParser::ParseDataBurst(BYTE src[], size_t len, const CString &strChannelID, const CString &strMsgID)
  788. {
  789.     return ParseDataBurst(src, len, _wtoi((LPCTSTR)strChannelID), _wtoi((LPCTSTR)strMsgID));
  790.     if (!IsGotaBurst(src, len))
  791.     {
  792. //      AfxMessageBox(L"worng");
  793.         return FALSE;
  794.     }
  795.     //for (size_t i = 0; i < len; i++)
  796.     //  wcout << src[i] << L" ";
  797.     //wcout << endl;
  798.     Reset();
  799.     MSXML2::IXMLDOMNodePtr pRoot = m_pXmlDoc->firstChild;
  800.     MSXML2::IXMLDOMNodePtr pChannel = GetFirstChildByID(pRoot, strChannelID);
  801.     MSXML2::IXMLDOMNodePtr pMsg = GetFirstChildByID(pChannel, strMsgID);
  802.     if (pMsg == NULL)
  803.         return FALSE;
  804. //  BSTR text = pChannel->baseName;
  805.     m_aRawData = src + 3;// 00 00 3c
  806.     m_nRemaine = len - 3;
  807.     m_nDataLength = m_nRemaine * 8;
  808.     m_nRemaine = m_nDataLength;
  809.     ParseMessage(pMsg);
  810.     return TRUE;
  811. }
  812. BOOL CXmlParser::Reset()
  813. {
  814.     m_nPos = 0;//important.
  815.     m_strInfo = L"";
  816.     m_strSummary = L"";
  817.     m_vdwData.clear();
  818.     return TRUE;
  819. }
  820. BOOL CXmlParser::ParseGotaData(BYTE src[], size_t len, int nChannelID, int nMsgID)
  821. {
  822.     if (IsFcsch(nChannelID))
  823.     {
  824.         if (GetFcsch_DB(s_nFcsch) == nMsgID)
  825.             return ParseDataBurst(src, len, s_nFcsch, nMsgID);
  826.         return ParseData(src, len, s_nFcsch);
  827.     }
  828.     if (IsRcsch(nChannelID))
  829.     {
  830.         if (GetRcsch_DB(s_nRcsch) == nMsgID)
  831.             return ParseDataBurst(src, len, s_nRcsch, nMsgID);
  832.         return ParseData(src, len, s_nRcsch);
  833.     }
  834.     if (IsFdsch(nChannelID))
  835.     {
  836.         if (GetFdsch_DB(s_nFdsch) == nMsgID)
  837.             return ParseDataBurst(src, len, s_nFdsch, nMsgID);
  838.         return ParseData(src, len, s_nFdsch);
  839.     }
  840.     if (IsRdsch(nChannelID))
  841.     {
  842.         if (GetRdsch_DB(s_nFdsch) == nMsgID)
  843.             return ParseDataBurst(src, len, s_nFdsch, nMsgID);
  844.         return ParseData(src, len, s_nFdsch);
  845.     }
  846.     return FALSE;
  847. }
  848. BOOL CXmlParser::ParseGotaData(BYTE src[], size_t len, const CString &strChannelID, const CString &strMsgID)
  849. {
  850.     int nChannelID = _wtoi((LPCTSTR)strChannelID);
  851.     int nMsgID = _wtoi((LPCTSTR)strMsgID);
  852.     
  853.     return ParseGotaData(src, len, nChannelID, nMsgID);
  854. }

这篇关于解析信令的类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482392

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端