999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

大數據量TLV文件快速解析程序設計及應用

2019-09-24 02:00:29孫立哲
電腦知識與技術 2019年19期

孫立哲

摘要:基于某產品測試實際需求,為了實現對大數據量TLV(Type,Length,Value)文件數據正確性的快速自動校驗,采用Java編程語言,基于面向對象技術以及內存映射技術,完成了對具有二級嵌套結構型的大數據量TLV文件解析程序設計。在實際應用中,該程序針對內含十萬條記錄的約50MB的TLV文件,其解析速率可達到提取單條記錄平均耗時在毫秒級,可以滿足快速解析大數據量TLV文件以便進一步作數據正確性校驗的需求。

關鍵詞:TLV文件;快速解析;內存映射文件;面向對象技術;Java編程

中圖分類號:TP311? ? ? 文獻標識碼:A

文章編號:1009-3044(2019)19-0016-04

Abstract: From the actual requirements of a product test, in order to achieve the rapid automatic verification for the data correctness of the large amount of data TLV file, this paper using Java programming language, based on object-oriented technology and memory mapping technology, designed a program for parsing TLV file including a large amount of data with a nested structure. In practical application, for a TLV file with the size of 50MB and containing one hundred thousand records, the parsing rate of the program can reach the extraction of a single record average time in milliseconds. It can satisfy the need of quickly analyzing large amount of data TLV files for further data correctness verification.

Key words: TLV format file; fast parsing; memory-mapped file; object-oriented technology; java programming

抽象語法標記[1](ASN.1)是一種ISO/ITU-T標準,描述了一種對數據進行表示、編碼、傳輸和解碼的數據格式。TLV文件是指采用標準化編碼規則[2](如基本編碼規則,BER)對ASN.1所描述的數據進行Tag、Length和Value三元組編碼后所形成的數據文件。BER編碼有兩種方式。一種是定長編碼方式,由三部分組成,分別對應TLV中的Tag、Length、Value。另一種是不定長編碼方式,由四部分組成,比定長編碼多一個結束標記字段[3]。每種類型都能編碼成定長編碼方式。Tag字段是關于標簽和編碼格式的信息,Length字段定義Value數值的長度,Value字段表示實際的數值。編碼可以是基本型或結構型[4]。如果編碼值的Value字段為基本數據類型,則屬基本型。如果編碼值的Value字段中嵌套有TLV結構數據,則屬結構型。根據編碼規則,結構型編碼值的Tag字節高四位數值為E,低四位數值代表嵌套層級。

某產品的合作雙方之間采用TLV文件進行數據傳輸,單個TLV文件大小基本在幾十兆字節,數據量一般在十萬。在TLV文件提供方完成數據文件生成后,進行文件傳輸前需對文件內數據進行正確性校驗。因為文件數據量比較大,且數據本身生成規則比較復雜,單純以手工方式進行校驗,完成全部校驗耗時極長。為了實現對大數據量TLV文件數據正確性的快速自動校驗,需要實現從TLV文件中快速提取各條數據。在大數據量文件處理方面,內存映射文件方法[5]提供了一種高效文件操作途徑。基于內存映射文件方法,應用程序可以通過內存指針對磁盤上的文件進行訪問,其過程如同對加載了文件的內存進行訪問,不必執行文件I/O操作,也無需對文件內容進行緩沖處理。由于取消了將文件數據加載到內存、數據從內存到文件的回寫以及釋放內存塊等操作,內存映射文件方法在處理大數據文件時表現出顯著的速度優勢[6-7]。本文基于面向對象技術[8]以及內存映射技術,在Eclipse開發平臺[9]采用Java編程語言,完成了對具有二級嵌套結構型的大數據量TLV文件解析程序設計。經過對內含十萬條記錄的49.6MB的TLV文件進行實踐解析,驗證了其解析速率可達到提取單條記錄平均耗時在毫秒級,基于此實現了對大批量數據正確性的快速校驗,進而完成了對該產品的功能自動化測試。

1 TLV文件數據結構實例簡介

某產品生成的TLV文件內含有記錄條目總數、各記錄數據以及其共有數據,各數據以二級嵌套結構型TLV編碼值組成。一級嵌套結構的Tag標簽和二級結構嵌套的Tag標簽均為一個字節表示,該字節對應的十六進制字串表示分別記為E1和E2。一級結構的Value值中含記錄條目總數itemCount、各記錄數據的共有數據pubData1(可有一條或多條)以及順序排列的各記錄數據Item。記錄條目總數itemCount和共有數據pubData1均為基本型TLV編碼數據,每個Item記錄數據均為一個結構型TLV編碼數據,即該TLV文件中的二級結構數據。Item記錄數據的Value由多個基本型itemData編碼數據組成。二級嵌套結構的TLV文件完整數據結構實例如圖1所示。

Length值采用BER編碼規則的定長編碼方式。Value值的字節長度小于等于127時,采用短型長度表示法。Value值的字節長度大于127時,采用長型長度表示法。短型長度表示法的Length字段由一個字節組成,最高位為零,其余位表示長度值。長型長度表示法的Length字段由多個字節組成,第一個字節最高位為一,其余位表示存放長度所占字節數,其余字節存放長度值。

2 大數據量TLV文件解析程序設計

本文針對特定二級嵌套結構型數據文件的TLV解析程序,主要由五個類構成,分別為TLV公共數據類、TLV單記錄數據類、TLV解析類、數據轉換工具類和文件操作工具類。TLV解析程序類圖如圖2所示。

TLV公共數據類是實體類,內含記錄總數屬性、公共數據串屬性、公共數據串長度屬性以及分別對各屬性進行設置的Setter方法和讀取的Getter方法。TLV公共數據類用于存放解析過程中從TLV文件中讀取的記錄總數和公共數據。

TLV單記錄數據類是實體類,內含各數據串屬性及其長度屬性以及分別對各屬性進行設置和讀取的方法。TLV單記錄數據類用于存放解析過程中從TLV文件中讀取的單條記錄下的各數據。數據串屬性個數與TLV單記錄中所含數據個數保持一致。

TLV解析類內含待解析TLV文件名配置屬性、解析后文件存儲目錄屬性、MappedByteBuffer類對象buffer屬性、TLV公共數據類對象tlvPubInfo屬性、TLV單記錄數據類對象tlvItem屬性、TLV單記錄起始位置索引值tlv_Item_Index屬性、下一個TLV單記錄起始位置索引值tlv_NextItem_Index屬性、主函數方法、初始化方法、TLV解析方法、獲取TLV公共數據方法、獲取單記錄數據方法、根據Tag索引值獲取TLV中長度和數值方法、寫TLV公共數據到二進制文件方法和寫單記錄數據到二進制文件方法。所有屬性變量均為靜態成員變量。主函數方法是整個解析程序的入口。初始化方法用于對待解析TLV文件名配置屬性和解析后文件存儲目錄屬性進行初始化。TLV解析方法內部通過實例化RandomAccessFile類對象并調用其getChannel方法從待解析TLV文件獲得一個FileChannel類對象,再調用FileChannel類對象的map方法將文件映射到內存MappedByteBuffer類對象(ByteBuffer類的子類)緩存,通過調用ByteBuffer類的get方法按位置逐字節讀取文件數據。獲取TLV公共數據方法用于從TLV文件中讀取公共數據并存于TLV公共數據類對象,獲取首個單記錄Tag位置索引值并存于tlv_Item_Index屬性。獲取單記錄數據方法用于根據tlv_Item_Index屬性值從TLV文件中讀取單個記錄的數據并存于TLV單記錄數據類對象,獲取下一個單記錄Tag位置索引值并存于tlv_NextItem_Index屬性,更新tlv_Item_Index屬性值為tlv_NextItem_Index屬性值。根據Tag索引值獲取TLV中長度和數值方法供獲取TLV公共數據方法和獲取單記錄數據方法調用,該方法內部實現根據TLV中Tag字節所在位置索引值讀取該TLV中Length所占字節數、Length數值和Value數據值。寫TLV公共數據到文件方法和寫單記錄數據到二進制文件方法分別用于將TLV公共數據類對象數據和TLV單記錄數據類對象數據寫入指定目錄下的二進制文件。

文件操作工具類完成解析過程中文件夾創建以及各文件的創建與寫入。文件操作工具類內含創建目錄方法和寫二進制文件方法。創建目錄方法先判斷目錄是否存在,若不存在則新建,若存在則使用已有目錄。寫二進制文件方法實現將已知長度的二進制數據寫入給定文件名的文件中。數據轉換工具類用于完成在解析過程中所需的各數據轉換。數據轉換工具類內含將ASCII碼十六進制字串轉為數據字串方法、將單字節轉為兩字符的十六進制字串方法、將十六進制字串轉為字節數組方法和將字節數組轉為十六進制字串方法。

在完成TLV文件到內存對象映射后,根據文件數據二級嵌套結構特點,依次逐字節進行解析。從一級嵌套結構中提取公共信息、記錄總數以及首個二級嵌套結構Tag索引位置。從首個二級嵌套結構Tag索引位置開始依次提取單記錄下各數據。解析過程中Value數據根據Length字段數據特點進行提取,具體實現:根據Tag標簽所在索引位置確定Length字段首字節所在索引位置,根據Length字段首字節高四位判斷Value值長度是否大于127。若Value值長度不大于127,則從Length字段所在索引位置的下一個字節開始提取指定長度的Value數據。若Value長度大于127,則根據Length首字節低四位判斷Length字段其余字節個數及對應的長度值,然后從Length字段首字節所在索引位置加長度值所占字節個數后所得索引位置的下一個字節開始提取指定長度的Value數據。結構型編碼值中,Value值中嵌套一個或多個子TLV編碼值的情況下,嵌套的首個TLV編碼值的Tag標簽索引位置為結構型編碼值的Tag標簽所在索引位置加其Length字段所占字節數后所得位置索引值的下一個字節所在位置,非首個TLV編碼值的Tag標簽索引位置與首個相比,還要再順延首個TLV編碼值中Value值長度個數的字節。解析過程中創建兩級文件夾目錄,一級文件夾目錄名以TLV文件名命名并存于解析前配置的存儲目錄下,二級文件夾目錄名以單記錄數據中具有唯一性標識的字段值命名,存于一級文件夾目錄下。有多少條Item記錄,則創建多少個二級文件夾目錄。一級文件夾下存放用于記錄公共信息pubData1的數據文件。二級文件夾目錄下存放該Item記錄下各itemData數據文件,一個itemData對應一個數據文件。整個解析過程業務流程圖如圖3、圖4和圖5所示。

3 TLV文件解析程序在實際產品測試中的應用

TLV文件數據結構實例簡介中所提及的產品,其主要功能是按某種規則生成各種數據存于數據庫,再從數據庫按一定規則提取相應數據生成TLV文件,以便于在網絡上進行數據傳輸。針對該產品若要實現各數據正確性自動化校驗,需要完成三個環節的自動化代碼設計,這三個環節按順序分別是檢查數據庫中各數據是否正確、解析TLV文件提取各數據和對TLV中各數據與數據庫中各數據作一致性對比。

本文的TLV解析程序即對應第二個環節。執行該TLV解析程序,對內含十萬條記錄的49.6 MB的TLV文件進行解析,整個解析過程耗時約為16分鐘,即提取單條長度為521字節的記錄數據平均耗時為9.6毫秒。解析耗時少,速度快。

將該解析程序集成到產品功能自動化測試腳本中,即在對數據庫各數據正確性作比對后,通過實例化TLV解析類對象并調用對象的TLV解析方法進行TLV文件解析,最后分別讀取解析后存于磁盤中的各數據文件中數據與數據庫中對應數據作一致性對比,從而實現整個數據正確性校驗過程的全自動化執行。解析后所得的各數據可全部完成對比校驗,且校驗結果準確率為百分百。

該解析程序是基于已知二級嵌套結構型TLV文件數據結構定制開發的,暫不具有普適性。若要使其具有一定的通用性,可在此基礎上作擴展改進。比如,若待解析TLV文件中數據不確定是否有嵌套結構型,或不知有幾層嵌套結構,可根據每個TLV編碼值的Tag字節的高四位是否為E判斷其是否為嵌套結構型,然后參照本文解析程序業務處理流程中所提及的關于Length字段的判斷等作后續分析。針對嵌套結構型TLV編碼值,繼續根據其Value字段中的Tag判斷是否有次級嵌套結構型,依次類推,最終判斷出嵌套層級。每增加一個嵌套結構,則按嵌套關系增加一級對應的文件夾目錄,用于存儲該嵌套結構下的各數據字段。對于在同一嵌套層級結構下不確定有多少個TLV編碼值的情況,可采用基于cglib動態創建類及動態添加類成員屬性的方式[10],針對該層級在程序執行過程中動態創建對應的類及屬性。

4 結語

本文從某產品測試實際需求出發,為了實現對大數據量TLV文件數據正確性的快速自動校驗,采用Java編程語言,基于面向對象技術以及內存映射技術,完成了對具有二級嵌套結構型的大數據量TLV文件解析程序設計,并將該程序集成到產品功能自動化測試中,完成了大批量數據的快速校驗,校驗耗時少,速率快。

參考文獻:

[1] International Telecommunications Union. ISO/IEC 8824-1, Information technology—Abstract Syntax Notation One (ASN.1): Specification of basic notation [S]. Geneva, Switzerland: ITU-T, 2015.

[2] International Telecommunications Union. ISO/IEC 8825-1, Information technology—ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER) [S]. Geneva, Switzerland: ITU-T, 2015.

[3] 娜仁. 一種嵌套數據格式的描述文法及其解析工具的設計與實現 [D]. 北京郵電大學,2018.

[4] 王沁,許娜,張燕,等. 優化TLV編碼規則[J]. 計算機科學,2008,35(11):104-261.

[5] Cay S. Horstmann. Java核心技術 卷I:基礎知識 [M]. 周立新,陳波,等譯. 10版. 北京:機械工業出版社,2016.

[6] 楊寧學,諸昌鈐,聶愛麗. 內存映射文件及其在大數據量文件快速存取中的應用 [J]. 計算機應用研究,2004(8):187-188.

[7] 于慧彬,齊鵬,梁捷,等. 內存映射文件在大數據量海洋調查數據處理中的應用 [J]. 海洋技術,2010,29(1):32-35.

[8] 丁任霜. 面向對象設計與應用[M]. 1版. 北京:北京大學出版社,2011.

[9] Eclipse Foundation. Eclipse [EB/OL]. [2006-6-2]. https://help.eclipse.org/2019-03/index.jsp

[10] 孫藝博,陳英,高晨紅. 基于CGLIB的AOP動態實現機制[J]. 計算機工程與設計,2005,26(11):3118-3120.

【通聯編輯:梁書】

主站蜘蛛池模板: 久久福利网| 国产精品主播| 色亚洲激情综合精品无码视频 | 国产精品视频3p| 亚洲国产系列| 久久人搡人人玩人妻精品| 在线看国产精品| 欧美 亚洲 日韩 国产| 亚洲Av激情网五月天| 青青草一区| 青青操国产视频| 色综合久久无码网| 午夜激情婷婷| 国产成年女人特黄特色毛片免 | 91香蕉视频下载网站| 2021天堂在线亚洲精品专区| 热久久这里是精品6免费观看| 黄色在线网| 成人无码区免费视频网站蜜臀| 国产天天射| 97久久精品人人| 制服丝袜无码每日更新| 久久婷婷人人澡人人爱91| 精品伊人久久大香线蕉网站| 成人av专区精品无码国产 | 久久熟女AV| 日韩精品一区二区深田咏美| 一区二区无码在线视频| 国产剧情一区二区| 亚洲午夜综合网| 国内a级毛片| 欧美天天干| 欧美国产在线精品17p| 欧美日本不卡| 中文纯内无码H| 91精品人妻互换| 久草视频福利在线观看| 亚洲人视频在线观看| 国产美女在线免费观看| 亚洲天堂福利视频| 国产区网址| 欧美日韩在线国产| 污污网站在线观看| 四虎成人免费毛片| 韩国v欧美v亚洲v日本v| 国产精品网拍在线| 欧美精品二区| 一级爱做片免费观看久久| 91午夜福利在线观看| 伊人色综合久久天天| 国产三级毛片| 自拍中文字幕| 欧美视频二区| 亚洲Aⅴ无码专区在线观看q| 波多野结衣一二三| 波多野结衣中文字幕一区| 免费一级毛片不卡在线播放| 国产精品短篇二区| 丝袜无码一区二区三区| 色欲综合久久中文字幕网| 夜夜高潮夜夜爽国产伦精品| 天天激情综合| 日韩免费成人| 国产亚洲高清在线精品99| 国产成人在线小视频| 黄色网页在线播放| 手机在线国产精品| 亚洲三级色| 红杏AV在线无码| 国产在线观看一区二区三区| 亚洲第一色视频| 99免费在线观看视频| 国产精品成人AⅤ在线一二三四| 在线a网站| 亚洲av无码牛牛影视在线二区| 成人国产精品2021| 日韩小视频在线播放| 欧美日韩91| 综合人妻久久一区二区精品| 亚洲无码免费黄色网址| 好久久免费视频高清| 午夜影院a级片|