<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設計應用 > 一種基于樹狀結構的新型解碼器

          一種基于樹狀結構的新型解碼器

          作者: 時間:2016-10-29 來源:網絡 收藏

          摘要:介紹了一種新型,能夠在數據包中解碼出期望KPI的值。在機站測試等過程中,需要查看一些KPI值,而所有KPI是服務器端以數據包的形式發(fā)送到客戶端的。首先把各個目標KPI按位與,得到總的目標值m,然后m與結構中的非葉子結點以及葉子結點按位與,如果結果值不等于非葉子結點,則跳過其子結點,繼續(xù)和其兄弟結點按位與,直到找到期望KPI。這種方法不用解碼出數據包中的全部數據,即可得到期望的KPI值,簡便而又高效,大大提高了工作效率。
          關鍵詞:;數據包;結構;C++;JAVA

          0 引言
          計算機網絡數據通常是以數據包進行傳輸的,數據包由報頭、負載、報尾等部分組成。在機站測試等過程中需要經常得到大量KPI(Key parameterindicator)的值,而這些KPI是由服務器以數據包的形式發(fā)送到客戶端的,那么如何在以二進制表示的數據包里面快速而準確地得到期望的KPI的值呢?在此設計了一個高效而實用的解碼器,用以快速得到某一字段的KPI值。

          1 解碼器簡介
          解碼器源代碼是一些C++代碼,用來解碼出數據包對應的KPI的值。在基站、網絡等測試過程中經常需要統計各種KPI的值,而相關KPI的值有時多達幾十甚至幾百個,如果想要在這龐大的數據里面,快速有效地得到一個或者幾個KPI的值,普通的方法是把這段碼流進行解碼得到全部對應的值之后再查找期望的值。這種方法不僅費時費力而且容易出錯,在此利用一種結構的數據結構設計出了解碼特定值的解碼器,用以獲取期望KPI的值。這種解碼器不僅能夠幫助工作人員快速得到期望的KPI值,而且減少出錯的幾率,提高了工作效率。
          下面介紹一些名詞的含義,消息是指由基本數據類型表示各種KPI及其組成形式的集合。消息定義文件是指用來定義諸如XSD、C頭文件、文本文件等消息格式的文件格式。邏輯表是XML格式文件,用來定義一些無法用C頭文件描述的邏輯條件。XSD即XML Schema Deftnition,用以規(guī)范和驗證XML格式的文檔。
          每條信息對應一個解碼函數,用以解碼數據包里面對應的二進制流數據,各種解碼函數構成了解碼器。它不是解碼整條消息,而是有選擇地解碼部分比特流以得到期望的KPI的值,因此它是非常高效的。
          端模式(Endian)是指在計算機體系結構中存儲信息的不同順序,分為大端(Big-endian)和小端(Little-endian)。大端指數據的高位存儲在內存的低地址中,而數據的低位存儲在內存的高地址中,小端則相反。
          由于需要解碼不同的消息,而不同的消息具有不同的格式,因此和消息對應的解碼函數也是不同的,那么就需要根據不同的消息格式生成相應的解碼函數。在此每條消息用相應C頭文件表示,然后根據C頭文件配置對應的邏輯表。以C頭文件和邏輯表作為輸入,編寫Java代碼利用Eclipse生成相應的解碼函數(解碼器)。
          軟件最終產品為解碼器,其為具有解碼功能的C++源代碼,能夠有選擇地解碼出想要查看的KPI的值。解碼器的輸入為配置參數、C頭文件、邏輯表。配置參數指出了消息的格式、C頭文件的路徑、邏輯表的路徑、生成的解碼器的輸出路徑以及是大端或小端解碼等。程序根據C頭文件所定義的消息生成XSD文件,其是與C頭文件中的結構體一一對應的,然后根據產生的XSD文件、邏輯表以及配置參數生成解碼器。其數據流程圖如圖1所示。

          本文引用地址:http://www.ex-cimer.com/article/201610/306549.htm

          a.JPG



          2 編碼方法
          每條消息都可由相應的結構體表示,這些結構體位于C頭文件中,可以寫成樹狀結構的形式。假設某條消息如圖2所示,由以下結構體表示:其中A p、B p和C p處于同一層,root為根結構體,包含了A p、B p和C p結構體?;緮祿愋桶ㄕ?、字符型、位域等,為葉子結點,非基本類型數據包括結構體數組、聯合等,為非葉子結點。在此,這條消息可由樹狀結構來表示,如圖3所示,root根結點表示為0000 0000,A結點表示為0000 0001,a1表示為0001 0001;B結點表示為0000 0010,b1表示為0001 0010,b2表示為0010 0010;C[0]表示為00000 100,c1表示為0001 0100,c2表示為0010 0100,c3表示為0100 0100;C表示為0000 1000,c4表示為0001 1000,c5表示為0010 1000,c6表示為01001000??梢妑oot、A、B、C[0]、C[1]為非葉子結點,是非基本數據類型,其余是葉子結點,是基本數據類型。我們稱root為A、B、C[0]和C[1]的父結點,A是a1的父結點,B是b1和b2的父結點,以此類推。注意到,每個父結點和其子結點位與()的結果值都為父結點,例如:root(0000 0000)A(0000 0001)=root(0000 0000),A(0000 0001)a1(0001 0001)=A(0000 0001),B(0000 0010)b2(0010 0010)=B(00 00 0010)。由此,若要取KPI b2和c4的值,那么傳入的目標值為m=b2 |(位或)c4=0011 1010,讓目標值依次與某結點位與(&),如果結果值等于某結點,那么說明某結點的子結點包含或者是目標值,例如m(0011 1010)&B(0000 0010)=B(0000 0010),又已知B是非葉子結點,故B的子結點中必定包含目標結點,然后m依次與b1和b2按位與,mb1 b1,又知b1是葉子結點,故b1不是要解的目標值,則跳過b1,繼續(xù)解b1的兄弟b2,顯然,mb2=b2,又知b2是葉子結點,故b2是要解的目標值,以此可得到c4也為目標值。又mA A,又知A是非葉子結點,故可把A結點以下的子結點跳過不解,以此類推,C[1]及其子結點也可以跳過不解,那么這就大大提高了解碼的效率。

          b.JPG


          有時候存儲信息不需要一個完整的字節(jié),只需要占一個或幾個二進制位,這種存儲信息的方式稱為位域。當消息里面包含位域的時候,由于不同的機器可能是大端或者小端。那么就需要定義是按照大端解碼還是按照小端解碼。

          3 模塊設計
          系統分為初始化、XSD轉換、XSD解析、XSD訪問等四個模塊。
          初始化模塊主要進行參數配置,然后開始運行Eclipse生成解碼器。需要配置的參數有:消息名稱、C頭文件路徑、邏輯表路徑、解碼器輸出路徑、端類型等。
          XSD轉換模塊主要進行C頭文件定義的結構體的解析,并生成XSD文件。
          XSD解析模塊將XSD文件解析成XSD素對象。這里采用DOM方式進行解析XSD文件,DOM(文檔對象模型)定義了層次化模型來表示XSD文檔,對應XSD中的每一個元素定義一個相應的類與其一一映射。解析時讀入整個XSD文件,然后在內存構建一個樹狀結構,每遇到一個元素就實例化一個元素對象。XSD元素對象分為根元素、結構體元素和葉子元素。根元素為整個XSD文件,如圖3中的root,結構體元素為XSD文件的非葉子結點,如圖3中的A、C[0]等,葉子元素為XSD文件的葉子結點,其存儲了具體的KPI的值,如圖3中的a1等。
          XSD訪問模塊的功能是在XSD對象中查詢邏輯表中的數據,并生成解碼器。
          邏輯表主要是用來表示在C頭文件中不能表示的邏輯情況,在此有三類常見的邏輯。通常在一個union里面有多個元素,在解碼原始數據流時要選擇正確的元素,那么,就必須有一個指引元素,其指明了哪一個元素是被選擇的。如果這個指引元素是在union外,那么就稱其為key out union,相反則稱其為key in union。如果我們要解碼的KPI是一個變長數組,那么顯然在C頭文件中是沒有辦法描述的,在此我們定義一個變量專門用來定義變長數組的長度,稱其為variable length array。在某種條件下在數據流中有的數據是沒有意義的,那么就需要我們定義一個變量來決定其是否有意義,我們稱這樣的變量為optional。

          4 結束語
          針對數據包中的大量數據,解碼器利用樹狀結構的編碼規(guī)則可以快速找到期望的KPI的值,這種對信息提取的高效性,可以大大提高工作效率,增加效益。此解碼器不僅可以單獨用來對數據包里面的數據進行提取,也可以和其它軟件一起構成一個小型測試系統等。



          關鍵詞: 樹狀 解碼器

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();