欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

.net文件中引用類型的壓縮方法和裝置的制作方法

文檔序號:4135240閱讀:282來源:國知局

專利名稱::.net文件中引用類型的壓縮方法和裝置的制作方法
技術領域
:本發(fā)明涉及計算機應用領域,具體而言,涉及一種.net文件中引用類型的壓縮方法和裝置。
背景技術
:.Net是微軟的新一代技術平臺,是全新的基于互聯(lián)網的跨語言軟件開發(fā)平臺,順應了當今軟件工業(yè)分布式計算、面向組件、企業(yè)級應用、軟件服務化和以Web為中心等大趨勢。.Net并非開發(fā)語言,但是在.Net開發(fā)平臺上可以支持多種開發(fā)語言,如C#語言丄++、VisualBasic、Jscript等。智能卡是一種大小和普通名片相仿的塑料卡片,內含一塊直徑lcm左右的硅芯片,具有存儲信息和進行復雜運算的功能。它被廣泛地應用于電話卡、金融卡、身份識別卡以及移動電話、付費電視等領域。其中,智能卡的芯片上,集成了微處理器、存儲器以及輸入/輸出單元等,使得智能卡被認為是世界上最小的電子計算機。并且在智能卡上,擁有一整套性能較強的安全保密控制機制,安全控制程序被固化在只讀存儲器中,因而具有無法復制密碼等可靠的安全保證。它較之普通磁卡,還具有信息存儲容量大,可利用微處理器來增加卡片功能等優(yōu)點。.Net卡是一種含有可以運行.Net程序的.Net卡虛擬機的微處理器智能卡。所謂虛擬機,是指可以把它想象成一臺用軟件來模擬的機器,在這臺機器里有處理器、內存、寄存器等各種硬件,模擬運行各種指令,在這臺機器上運行的軟件對運行環(huán)境沒有特殊要求,所以虛擬機對在它上運行的程序來說是透明的。例如,x86虛擬機模擬的是x86指令程序的運行環(huán)境,c51虛擬機模擬的是c51指令程序的運行環(huán)境。.net程序包括命名空間、引用類型、定義類型、定義方法、引用方法、IL(IntermediateLanguage,中間語言)代碼等,其中引用類型是由類型的實際值引用(類似于指針)表示的數(shù)據(jù)類型。但是目前的智能卡由于體積和存儲芯片的限制,其存儲空間仍然有限,隨著軟件的發(fā)展,部分功能大的程序占用存儲空間較大,對于很多的.net程序并不能進行存儲和運行。綜上所述,相關技術中的.net程序不能很好地在小容量的存儲介質(例如智能卡)上存儲和運行,且針對該問題目前尚未提出有效的解決方案。
發(fā)明內容針對.net程序不能很好地在小容量的存儲介質(例如智能卡)上存儲和運行而提出本發(fā)明,為此,本發(fā)明的主要目的在于提供一種.net文件中引用類型的壓縮方法和裝置,以解決上述問題至少之一。為了實現(xiàn)上述目的,根據(jù)本發(fā)明的一個方面,提供了一種.net文件中引用類型的壓縮方法。根據(jù)本發(fā)明的.net文件中引用類型的壓縮方法包括獲取.net文件中使用的引用類型的名稱,并進行壓縮,得到壓縮后的引用類型的名稱;統(tǒng)計所述引用類型的方法計數(shù)和字段計數(shù);按照預先確定的格式對所述壓縮后的引用類型的名稱、所述方法計數(shù)和所述字段計數(shù)進行組合,得到所述引用類型的壓縮結果。為了實現(xiàn)上述目的,根據(jù)本發(fā)明的另一方面,提供了一種.net文件中引用類型的壓縮裝置,所述裝置包括引用類型名稱獲取模塊,用于獲取.net文件中使用的引用類型的名稱;壓縮模塊,用于對所述引用類型名稱獲取模塊獲取的引用類型的名稱進行壓縮,得到壓縮后的引用類型的名稱;統(tǒng)計模塊,用于統(tǒng)計所述引用類型名稱獲取模塊獲取的引用類型的方法計數(shù)和字段計數(shù);組合模塊,用于按照預先確定的格式對所述壓縮模塊壓縮后的引用類型的名稱、所述統(tǒng)計模塊統(tǒng)計出的方法計數(shù)和字段計數(shù)進行組合,得到所述引用類型的壓縮結果。本發(fā)明采用對獲取到的引用類型的名稱進行壓縮,并將壓縮后的引用類型的名稱與統(tǒng)計出的方法計數(shù)和字段計數(shù)進行組合,得到壓縮后的引用類型,可以有效地降低.net文件占用的存儲空間,使.net文件可以在小容量存儲介質(例如智能卡)上存儲并運行,進而增強了小容量存儲介質(例如智能卡)的功能。此處所說明的附圖用來提供對本發(fā)明的進一步理解,構成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構成對本發(fā)明的不當限定。在附圖中圖1是本發(fā)明實施例1提供的.net文件中引用類型的壓縮裝置的結構框圖;圖2是本發(fā)明實施例1提供的引用類型名稱獲取模塊的具體結構框圖;圖3是本發(fā)明實施例2提供的.net文件中引用類型的壓縮方法的流程圖;圖4是本發(fā)明實施例3提供的.net文件中引用類型的壓縮方法的流程圖;圖5是本發(fā)明實施例3提供的.net文件的結構示意圖;圖6是本發(fā)明實施例3提供的統(tǒng)計引用類型的方法計數(shù)和字段計數(shù)的方法流程圖。具體實施例方式下文中將參考附圖并結合實施例來詳細說明本發(fā)明。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面結合附圖對技術方案的實施作進一步的詳細描述實施例1本實施例提供了一種.net文件中引用類型的壓縮裝置,如圖l所示,該裝置包括引用類型名稱獲取模塊102、壓縮模塊104、統(tǒng)計模塊106和組合模塊108,各個模塊的功能如下引用類型名稱獲取模塊102,用于獲取.net文件中使用的引用類型的名稱;壓縮模塊104,用于對引用類型名稱獲取模塊102獲取的引用類型的名稱進行壓縮,得到壓縮后的引用類型的名稱;統(tǒng)計模塊106,用于統(tǒng)計引用類型名稱獲取模塊102獲取的引用類型的方法計數(shù)和字段計數(shù);組合模塊108,用于按照預先確定的格式對壓縮模塊104壓縮后的引用類型的名稱、統(tǒng)計模塊106統(tǒng)計出的方法計數(shù)和字段計數(shù)進行組合,得到引用類型的壓縮結果。其中,引用類型名稱獲取模塊102可以采用多種方式獲取引用類型的名稱,本實施例以圖2所示為例進行說明,如圖2所示,為本實施例提供的引用類型名稱獲取模塊的具體結構框圖,引用類型名稱獲取模塊102包括第一元數(shù)據(jù)表獲取單元1022,用于獲取.net文件中第一元數(shù)據(jù)表;在.net文件中包含有多個表,本實施例中將元數(shù)據(jù)表TypeRef(引用類型或接口表)作為第一元數(shù)據(jù)表,該表中記錄了.net文件中使用的引用類型的名稱和該引用類型所屬的命名空間。地址信息讀取單元1024,用于從第一元數(shù)據(jù)表獲取單元1022獲取的第一元數(shù)據(jù)表中讀取該.net文件中使用的引用類型的名稱的地址信息;引用類型名稱讀取單元1026,用于根據(jù)地址信息讀取單元1024讀取的地址信息讀取引用類型的名稱。優(yōu)選的,壓縮模塊104進行壓縮時采用的算法可以是散列算法,具體而言,可以為MD5、SHA-1或SHA-2等。統(tǒng)計模塊106在統(tǒng)計方法計數(shù)和字段計數(shù)時,可以根據(jù)第二元數(shù)據(jù)表中記錄的信息進行統(tǒng)計,其中,第二元數(shù)據(jù)表為.net文件中的元數(shù)據(jù)表MemberRef,該表中的每行數(shù)據(jù)記錄了引用類型信息和特征標識值,根據(jù)引用類型信息中的數(shù)據(jù)可以確定當前行數(shù)據(jù)指向第一元數(shù)據(jù)表TypeRef中第幾行記錄的引用類型,進而確定該當前行數(shù)據(jù)指向的引用類型的名稱;特征標識值中的數(shù)據(jù)用以指明該當前行數(shù)據(jù)記錄的是方法還是字段,根據(jù)特征標識值中的數(shù)據(jù)則可以統(tǒng)計出每個引用類型的名稱對應的方法計數(shù)和字段計數(shù)。優(yōu)選的,組合模塊108中的預先確定的格式為固定長度的字節(jié),該固定長度的字節(jié)包括三部分,其中,第一部分為壓縮后的引用類型的名稱,第二部分為方法計數(shù),第三部分為字段計數(shù)。這三部分可以任意組合。在引用類型的壓縮結果中包含方法計數(shù)和字段計數(shù)的目的是當.net文件的其他部分也進行了對應的壓縮時,可以根據(jù)該方法計數(shù)查找到對應的方法,根據(jù)字段計數(shù)查找到對應的字段,使壓縮后的引用類型能夠正常使用。本實施例中的壓縮模塊104采用對引用類型名稱獲取模塊102獲取到的引用類型的名稱進行壓縮,組合模塊108通過對壓縮模塊104壓縮后的引用類型的名稱和統(tǒng)計模塊106統(tǒng)計出的方法計數(shù)、字段計數(shù)進行組合,得到壓縮后的引用類型,可以有效地降低.net文件占用的存儲空間,使.net文件可以在小容量存儲介質(例如智能卡)上存儲并運行,進而增強了小容量存儲介質(例如智能卡)的功能。實施例2本實施例提供了一種.net文件中引用類型的壓縮方法,該方法以在實施例1提供的壓縮裝置中運行為例進行說明,如圖3所示,該方法包括步驟S202:引用類型名稱獲取模塊102獲取.net文件中使用的引用類型的名稱;步驟S204:壓縮模塊104對引用類型名稱獲取模塊102獲取的引用類型的名稱進行壓縮,得到壓縮后的引用類型的名稱;步驟S206:統(tǒng)計模塊106統(tǒng)計引用類型名稱獲取模塊102獲取的引用類型的方法計數(shù)和字段計數(shù);步驟S208:組合模塊108按照預先確定的格式對壓縮模塊104壓縮后的引用類型的名稱、統(tǒng)計模塊106統(tǒng)計出的方法計數(shù)和字段計數(shù)進行組合,得到引用類型的壓縮結果。優(yōu)選的,步驟S202具體包括引用類型名稱獲取模塊102獲取.net文件中第一元數(shù)據(jù)表;從第一元數(shù)據(jù)表中讀取該.net文件中使用的引用類型的名稱的地址信息;根據(jù)該地址信息讀取上述引用類型的名稱。優(yōu)選的,步驟S202中還可以包括根據(jù)獲取的引用類型的名稱生成引用類型名稱字符串的步驟,該引用類型名稱字符串具體可以采用以下兩種方式中的任一種實現(xiàn)1)壓縮模塊104將上述獲取的引用類型的名稱轉換成預定的編碼格式,例如ASCII編碼,生成引用類型名稱字符串。2)壓縮模塊104先獲取上述引用類型所屬的命名空間名稱;將該命名空間名稱與上述引用類型的名稱組合,生成引用類型名稱字符串。壓縮模塊104對上述引用類型的名稱進行壓縮的步驟包括對上述引用類型的名稱(或者生成的引用類型名稱字符串)進行散列運算得到散列值;取所述散列值中預定的字節(jié)作為壓縮后的引用類型的名稱。其中,散列運算采用的算法為MD5、SHA-l或SHA-2等。優(yōu)選的,統(tǒng)計模塊106統(tǒng)計方法計數(shù)和字段計數(shù)的步驟具體包括獲取第二元數(shù)據(jù)表;對該第二元數(shù)據(jù)表的每一行執(zhí)行下述操作讀取該第二元數(shù)據(jù)表中當前行數(shù)據(jù)所指向的引用類型;當上述當前行數(shù)據(jù)指向的引用類型的名稱與引用類型名稱獲取模塊102獲取的引用類型的名稱一致時,根據(jù)上述當前行數(shù)據(jù)的特征標識值判斷該當前行數(shù)據(jù)記錄的是否為方法,如果是,將上述引用類型的方法計數(shù)加1;否則,將上述引用類型的字段計數(shù)加1。優(yōu)選的,組合模塊108中提到的預先確定的格式為固定長度的字節(jié),該固定長度的字節(jié)包括三部分,其中,第一部分為壓縮后的引用類型的名稱,第二部分為方法計數(shù),第三部分為字段計數(shù)。其中,上述第一元數(shù)據(jù)表和第二元數(shù)據(jù)表可以具體為實施例1中的元數(shù)據(jù)表,這里不再贅述。本實施例提供的方法是以在實施例1提供的壓縮裝置中實現(xiàn)為例進行的說明。采用對獲取到的引用類型的名稱進行壓縮,組合壓縮后的引用類型的名稱和統(tǒng)計出的方法計數(shù)、字段計數(shù),得到壓縮后的引用類型,可以有效地降低.net文件占用的存儲空間,使.net文件可以在小容量存儲介質(例如智能卡)上存儲并運行,進而增強了小容量存儲介質(例如智能卡)的功能。實施例3本實施例提供了一種.net文件中引用類型的壓縮方法,該方法中將經過.net平臺編譯后的未被壓縮的文件稱為.net文件。如圖4所示,為本實施例提供的.net文件中引用類型的壓縮方法流程圖,包括步驟S302至步驟S310,具體如下步驟S302:獲取.net文件中的第一元數(shù)據(jù)表,本實施例中的第一元數(shù)據(jù)表具體為元數(shù)據(jù)表TypeRef;在.net文件中包含有多個表,其中元數(shù)據(jù)表TypeRef(引用類型或接口表)中記錄了.net文件中使用的引用類型的名稱和該引用類型所屬的命名空間的信息;元數(shù)據(jù)表為PE(PortableExcutable,可移植可執(zhí)行)文件的一部分,本實施例以將下面的代碼編譯后得到的.net文件為例進行說明namespaceMyCompany.MyOnCardApp}}publicclassClassB{}publicstructStructB{}}對上述代碼使用.net平臺編譯后得到helloworld.exe文件,并以二進制的形式存儲在硬盤上,該二進制文件為.net文件,如圖5所示,為本實施例提供的.net文件的結構示意圖,該文件包括Dos頭、PE特征以及元數(shù)據(jù)(MetaData),元數(shù)據(jù)中包括元數(shù)據(jù)頭(MetaDataHeader)、元數(shù)據(jù)表(tables)等。下面對獲取元數(shù)據(jù)表TypeRef的過程進行說明a.定位.net文件的Dos頭,本實施例得到的Dos頭為0x5a4d;b.從dos頭后跳過第一約定個字節(jié),讀出PE特征的偏移地址,得到PE特征的偏移地址0x00000080;在本實施例中,第一約定個字節(jié)為0x003a個字節(jié);c.根據(jù)PE特征偏移地址0x00000080定位PE特征,定位得到PE特征0x4550;d.在PE特征向后偏移第二約定個字節(jié)后讀取四個字節(jié),在本實施例中,以32位機為例進行說明,第二約定個字節(jié)為從PE特征向后偏移0x0074字節(jié)后,讀出4個字節(jié)的數(shù)據(jù)為0x00000010,此值說明該二進制文件中存在0x10個目錄且包含.net數(shù)據(jù);其中,.net文件的元數(shù)據(jù)頭相對虛擬地址寫在上述第0x0F個目錄中,在64位機中第二約定個字節(jié)為0x0084個字節(jié);publicclassMyService:MarshalByRefObjectstaticVersionver=newVersionQ,1,1,1);staticInt32callCo皿t=0;staticClassBclassb=newClassB();StringstrResult=Boolean.FalseString;publicStringMyS咖pleMethod()StringstrHello=〃HelloWorld!〃;returnstrHello+callCoimt.ToString()58e.從上述數(shù)據(jù)0x00000010,向后偏移第三約定個字節(jié)后讀取八個字節(jié)數(shù)據(jù),在本實施例中,優(yōu)選地,第三約定個字節(jié)為112個字節(jié),在此八個字節(jié)數(shù)據(jù)中,前四個字節(jié)為0x00002008,為.net數(shù)據(jù)頭的相對虛擬地址,后四個字節(jié)為0x00000048,為.net數(shù)據(jù)頭的長度;f.根據(jù).net數(shù)據(jù)頭的相對虛擬地址得到線性地址0x00000208,并讀取.net數(shù)據(jù)頭得到如下數(shù)據(jù)48000000020005008C210000A0090000090000000500000600000000000000005020000080000000000000000000000000需要說明的是,上述數(shù)據(jù)采用小端的存儲方式,例如,上述數(shù)據(jù)前4個字節(jié)0x48000000為該數(shù)據(jù)的長度,轉換成大端的存儲方式為0x0000048;在本實施例中,線性地址為.net數(shù)據(jù)在.net文件中的地址,相對虛擬地址為相對于PE載入點的內存偏移,線性地址和相對虛擬地址的轉換關系為線性地址=相對虛擬地址_節(jié)相對虛擬地址+節(jié)的文件偏移,在本實施例中,讀取.net文件中.net數(shù)據(jù)目錄的節(jié)的相對虛擬地址為0x00002000,節(jié)的文件偏移為0x00000200,則線性地址=0x00002008-0x00002000+0x00000200=0x00000208;g.由.net數(shù)據(jù)頭向后偏移第四約定個字節(jié)后讀取八個字節(jié)數(shù)據(jù),在本實施例中第四約定個字節(jié)為從.net數(shù)據(jù)頭向后偏移8個字節(jié)后,讀取共8個字節(jié),在這8個字節(jié)中,前四個字節(jié)為0x0000218c,為元數(shù)據(jù)頭(MetaDataHeader)的相對虛擬地址,后四個字節(jié)為0x000009a0,為元數(shù)據(jù)的長度;h.將元數(shù)據(jù)頭的相對虛擬地址0x0000218c轉換得到線性地址0x0000038c,根據(jù)線性地址和元數(shù)據(jù)長度,得到元數(shù)據(jù)內容;i.由元數(shù)據(jù)頭向后讀取,當讀取到標志"#"時,讀取標志"#"前的八個字節(jié),其中前四個字節(jié)為"#"的地址,通過該地址得到"#"流,在"#"流中第五約定個字節(jié)開始讀取開始讀取長度為8個字節(jié)的數(shù)據(jù),即0x0000000920021c57,其二進制形式為100100100000000000100001110001010111;在本實施例中,第五約定個字節(jié)為"#"流中起始位開始算起第9個字節(jié);j.根據(jù)步驟i中得到的二進制數(shù)據(jù),從低位開始讀取,例如,第1位代表元數(shù)據(jù)表Module是否存在,如果是1則證明存在元數(shù)據(jù)表Module,如果是0證明不存在,在本實施例中,存在元數(shù)據(jù)表Module,并且第2位為1表示元數(shù)據(jù)表TypeRef存在;其中,在步驟i中所得到的數(shù)據(jù)中,從低位開始,每一位代表.net文件中是否存在對應的表;k.在數(shù)據(jù)0x0000000920021c57后偏移第六約定個字節(jié)后讀取元數(shù)據(jù)表TypeRef的數(shù)據(jù)行數(shù),在本實施例中為向后偏移12個字節(jié)后讀取4個字節(jié),得到數(shù)據(jù)0x0000001e,判斷得出元數(shù)據(jù)表TypeRef中存在30個數(shù)據(jù)行;其中,在元數(shù)據(jù)中,數(shù)據(jù)0x0000000920021c57向后偏移8個字節(jié)后的數(shù)據(jù)中以每4個字節(jié)為一個單位依次存儲了在.net文件中存在的元數(shù)據(jù)表的數(shù)據(jù)行數(shù),在表示數(shù)據(jù)行數(shù)的數(shù)據(jù)后,依次存儲了每個元數(shù)據(jù)表的具體內容,為元數(shù)據(jù)表區(qū)域;1.根據(jù)約定的方法讀取元數(shù)據(jù)表TypeRef的具體內容。其中,約定的方法如下,以本實施例中的.net文件為例進行說明,在步驟j中判斷得出元數(shù)據(jù)表Module存在,并讀取其數(shù)據(jù)行數(shù)為1,元數(shù)據(jù)表Module的數(shù)據(jù)行每行數(shù)據(jù)為10個字節(jié),因此在元數(shù)據(jù)表區(qū)域中,向后偏移10個字節(jié),第11個字節(jié)開始為元數(shù)據(jù)表TypeRef的內容,元數(shù)據(jù)表TypeRef的數(shù)據(jù)行為30行,每行數(shù)據(jù)為6個字節(jié),因此元數(shù)據(jù)表TypeRef的數(shù)據(jù)長度為30*6=180個字節(jié);元數(shù)據(jù)表TypeRef的部分數(shù)據(jù)如下060061005A00060074005A0006007B005A00060085005A000600EF00DDOO06000801DDOO06002101DDOO06003C01DDOO上述數(shù)據(jù)為本實施例所提供的.net文件中元數(shù)據(jù)表TypeRef中的前8行數(shù)據(jù),在本實施例中元數(shù)據(jù)表TypeRef共30行數(shù)據(jù),剩余的數(shù)據(jù)處理方法相同,不再一一列舉。在上述數(shù)據(jù)的每一行中,由高位到低位,前兩個字節(jié)為類型解析作用域的編碼標識,第3、4個字節(jié)為該引用類型的名稱在"ftStrings"流中的偏移量,后兩個字節(jié)為該引用類型所屬的命名空間名稱在"ftStrings"流中的偏移量,為便于說明,參見表l所示表l類型解析作用域編碼標識(ResolutionScop)類型名稱(TypeName)命名空間(Namespace)00600061005a00600074005a0060007b005a00600085005a0060OOefOOdd00600801OOdd00600121OOdd0060013cOOdd需要說明的是,表中的數(shù)據(jù)使用大端的表示方法,例如第一個數(shù)據(jù)行的數(shù)據(jù)為0060,0061,005a,對應的小端表示方法為060061005a00;在使用本實施例提供的壓縮方法時,初始化設定所有引用類型的方法計數(shù)為O,所有引用類型的字段計數(shù)為O,上述引用類型的方法計數(shù)為在.net文件中該引用類型包括的方法的個數(shù),引用類型的字段計數(shù)為該引用類型包括的字段的個數(shù);步驟S304:讀取.net文件中引用類型的名稱,并將該引用類型的名稱轉換為引用類型名稱字符串;在步驟S302中獲取了引用類型的名稱相對于"ftStrings"流的偏移量,本實施例以元數(shù)據(jù)表TypeRef中第一個引用類型,即相對偏移量為0x0061的引用類型為例,說明獲取引用類型的名稱方法如下在步驟S302中的步驟h中獲得元數(shù)據(jù)頭的地址0x0000038c后,從元數(shù)據(jù)頭開始向后讀取,當發(fā)現(xiàn)標記"SStrings""后,讀取"SStrings"的前8個字節(jié),得到數(shù)據(jù)0x5C0300003C040000;數(shù)據(jù)0x5C0300003C040000的高4個字節(jié)為"#Strings"流相對于元數(shù)據(jù)頭的偏移,低4個字節(jié)為"#StringS"流的長度,其中,高4個字節(jié)轉換成大端的表示方式為0x0000035c,低4個字節(jié)轉換成大端的表示方式為0x0000043c;根據(jù)元數(shù)據(jù)頭的地址0x0000038c向后偏移0x0000035c得到"#Strings"流的數(shù)據(jù)區(qū)域,根據(jù)元數(shù)據(jù)表TypeRef中第一個引用類型的偏移量,由"ftStrings"流的頭向后偏移0x0061,并向后讀取直到00結束,得到第一個引用類型的名稱為0x4D61727368616C42795265664F626A656374;通過ASCII碼對第一個引用類型的名稱進行轉換得到引用類型名稱字符串MarshalByRefObject,其他引用類型的名稱讀取與轉換方法與第一個引用類型的名稱相同,不再贅述;其中,引用類型名稱字符串還可以通過下述方法獲取獲取引用類型的名稱,并獲取該引用類型所屬的命名空間名稱,將命名空間名稱使用連接符"."與引用類型的名稱連接得到引用類型名稱字符串,例如第一個引用類型所屬的命名空間為System,按上述方法可得到第一個引用類型的名稱轉換后的引用類型名稱字符串System.MarshalByRefObject;步驟S306:對引用類型名稱字符串進行散列運算,并取預定的字節(jié)作為壓縮后的引用類型的名稱;其中,進行散列運算的算法可以為MD5、SHA-1、SHA-2等,本實施例中,優(yōu)選地采用MD5算法進行說明,對步驟S304中得到的引用類型名稱字符串"MarshalByRefObject"進行MD5運算得到一個120位的MD5值"3064AB63C4B4DC57770E9BDF25B7547D";在本實施例中,優(yōu)選地取上述MD5值前兩個字節(jié)作為壓縮后的引用類型的名稱,即"3064";需要說明的是,在本實施例中,可以按照步驟S302-S306的順序,依次讀取一個引用類型的名稱并進行壓縮得到壓縮結果,也可以先獲得.net文件中所有的引用類型的名稱,然后對得多引用類型的名稱逐一進行壓縮得到壓縮結果,并將得到的壓縮結果進行緩存;步驟S308:統(tǒng)計上述得到的引用類型的方法計數(shù)和字段計數(shù);11參見圖6,為本實施例提供的統(tǒng)計引用類型的方法計數(shù)和字段計數(shù)的方法流程圖,引用類型的方法計數(shù)和字段計數(shù)統(tǒng)計方法如下步驟S3081:獲取第二元數(shù)據(jù)表,本實施例中的第二元數(shù)據(jù)表具體為元數(shù)據(jù)表MemberRef;在本實施例中,獲取元數(shù)據(jù)表MemberRef的過程包括由步驟S302中獲取元數(shù)據(jù)表TypeRef的步驟i中獲得的二進制數(shù)據(jù)100100100000000000100001110001010111可知,由低位開始讀取,第11位為1表示元數(shù)據(jù)表MemberRef存在,第11位前共有5個l,判斷得出元數(shù)據(jù)表MemberRef前存在其他5個元數(shù)據(jù)表;由步驟k得知,讀取得到的元數(shù)據(jù)表MemberRef中存在23個數(shù)據(jù)行,并且元數(shù)據(jù)表MemberRef前的五個表中共存在50個數(shù)據(jù)行;其中,元數(shù)據(jù)表Module包括數(shù)據(jù)行為1行,元數(shù)據(jù)表TypeRef包括數(shù)據(jù)行為30行,元數(shù)據(jù)表TypeDef包括數(shù)據(jù)行為6行,元數(shù)據(jù)表Field包括數(shù)據(jù)行為7行,元數(shù)據(jù)表Method包括數(shù)據(jù)行為6行;根據(jù)步驟S302中的步驟1中約定的方法得知,元數(shù)據(jù)表Module的數(shù)據(jù)行中每行為10個字節(jié),元數(shù)據(jù)表TypeRef的數(shù)據(jù)行中每行為6個字節(jié),元數(shù)據(jù)表TypeDef的數(shù)據(jù)行中每行為14個字節(jié),元數(shù)據(jù)表Field的數(shù)據(jù)行中每行為6個字節(jié),元數(shù)據(jù)表Method的數(shù)據(jù)行中每行為14個字節(jié);因此元數(shù)據(jù)表MemberRef在元數(shù)據(jù)表區(qū)域的偏移地址為1*10+30*6+6*14+7*6+6*14=400,從元數(shù)據(jù)表區(qū)域開始偏移400個字節(jié)后得到元數(shù)據(jù)表MemberRef的內容,元數(shù)據(jù)表MemberRef的數(shù)據(jù)行為每行6個字節(jié),計算得到元數(shù)據(jù)表MemberRef的長度為23*6=138個字節(jié),元數(shù)據(jù)表MemberRef的部分數(shù)據(jù)如下2900COOO43003100COOO43003900COOO48004100COOO43004900COOO43005100COOO43005900COOO43006100COOO4300上述數(shù)據(jù)為本實施例所提供的.net文件的元數(shù)據(jù)表MemberRef中的前8行中的數(shù)據(jù),其他數(shù)據(jù)處理方法相同,這里不再一一列舉。在元數(shù)據(jù)表MemberRef中儲存有引用類型的方法和字段信息,上述數(shù)據(jù)的每一行記錄一個方法或字段的引用特征,即特征標識值(signature)。其中,每行數(shù)據(jù)的高2個字節(jié)表示該字段或方法指向的引用類型,中間2個字節(jié)為該字段或方法的名稱,低2個字節(jié)表示該方法或字段的特征標識值相對于"#Blob"流的偏移量,特征標識值signature記錄了該數(shù)據(jù)行所表示的為方法還是字段,以及返回值等信息。為了便于說明,參見表2,表2為上述8行數(shù)據(jù)的列表形式表2<table>tableseeoriginaldocumentpage13</column></row><table>步驟S3082:讀取元數(shù)據(jù)表MemberRef中每個方法或字段指向的引用類型;如表2所示,高2個字節(jié)記錄的為該行方法或字段指向的引用類型,下面以元數(shù)據(jù)表MemberRef中第一行數(shù)據(jù)進行說明,Class為0x0029,將0x0029轉換成二進制101001,向右移3位得到IOI,轉換成十進制為5,則元數(shù)據(jù)表MemberRef中第一行的字段或方法指向元數(shù)據(jù)表TypeRef中第5行所記錄的引用類型,通過步驟S302和步驟S304所述的方法可得到元數(shù)據(jù)表TypeRef中第5行所記錄的引用類型的名稱為AssemblvKevNameAttribute;步驟S3083:依次獲取元數(shù)據(jù)表MemberRef中每個方法或字段的特征標識值signature5如表2所示,在元數(shù)據(jù)表MemberRef中每一行的低2字節(jié)為該方法或字段的特征標識值signature相對于"#Blob"流的偏移;獲取元數(shù)據(jù)表MemberRef中每個方法或字段的signature的方法如下定位"ftBlob"流的位置,即在步驟S302中的步驟h中獲得元數(shù)據(jù)頭的地址0x0000038c后,從元數(shù)據(jù)頭開始向后讀取,當發(fā)現(xiàn)標記"ftBlob"后,讀取"ftBlob"前的8個字節(jié),得到數(shù)據(jù)0xE4070000BC010000,其中高4個字節(jié)為"#Blob"流相對于元數(shù)據(jù)頭的偏移,低4個字節(jié)為"ftBlob"流的長度,高4個字節(jié)轉換成大端的表示方式為0x000007e4,低4個字節(jié)轉換成大端的表示方式為0x000001bc;壓縮程序根據(jù)元數(shù)據(jù)頭的地址0x0000038c,向后偏移0x000007e4得到"#Strings"流的數(shù)據(jù)區(qū)域;本實施例以讀取元數(shù)據(jù)表MemberRef中第一行數(shù)據(jù)行為例進行說明,第一行特征標識值signature偏移為0x0043,在"ftBlob"流中偏移0x0043獲得第一行數(shù)據(jù)的特征標識值signature為0x2001010e;步驟S3084:根據(jù)讀出的特征標識值signature判斷該當前行數(shù)據(jù)記錄的是方法還是字段,如果是方法,執(zhí)行步驟S3085,如果是字段,執(zhí)行步驟S3086;本實施例以讀取元數(shù)據(jù)表MemberRef中第一行數(shù)據(jù)行讀出的特征標識值signature為例進行說明,根據(jù)讀出的特征標識值signature判斷是方法還是字段的具體過程如下第一行數(shù)據(jù)行讀出的特征標識值signature為0x2001010e,本實施例的判斷標準為當特征標識值signature的后4位為0x060e時,該當前行數(shù)據(jù)記錄的為字段,否則,該行數(shù)據(jù)記錄的為方法;由此可知,在本實施例中,元數(shù)據(jù)表第一行數(shù)據(jù)記錄的為方法,即引用類型AssemblvKevNameAttribute弓|用了元數(shù)據(jù)表MemberRef中第一行所記錄的方法;步驟S3085:將元數(shù)據(jù)表MemberRef中該當前行數(shù)據(jù)所指向的引用類型的方法計數(shù)加1,然后返回步驟S3083;步驟S3086:將元數(shù)據(jù)表MemberRef中該當前行數(shù)據(jù)所指向的引用類型的字段計數(shù)加1,然后返回步驟S3083;通過步驟S3081-S3086中提供的方法,將元數(shù)據(jù)表MemberRef全部讀取完成后,得到.net文件中所有引用類型的方法計數(shù)和字段計數(shù);需要說明的是,在本實施例中,步驟S302-S306與步驟S308的順序可以互換執(zhí)行,即先執(zhí)行步驟S308,再執(zhí)行步驟S302-S306,也可得到本實施例相同的效果;步驟S310:按照預先確定的格式對壓縮后的引用類型的名稱、該引用類型的方法計數(shù)和字段計數(shù)進行組合,得到引用類型的壓縮結果;在本實施例中,預先確定的格式可以為表3所示格式,即該格式為一段固定長度的字節(jié),該固定長度可以根據(jù)需要設定,這段字節(jié)中包括三個部分,第一部分為壓縮后的引用類型的名稱,第二部分為該引用類型的方法計數(shù),第三部分為該引用類型的字段計數(shù)。表3壓縮后的引用類型的名稱方法計數(shù)字段計數(shù)按照表3所示結構將步驟S306中得到的壓縮后的引用類型的名稱和與其對應的方法計數(shù)和字段計數(shù)進行組合,得到壓縮后的引用類型,當該引用類型的方法計數(shù)或字段計數(shù)為0時,使用0x00進行填充,例如對引用類型MarshalByRefObject的壓縮結果為0x30640100。表3所示的壓縮結構僅為最優(yōu)的結構,壓縮結構還可以做相應的變換,例如將上述壓縮結構中方法計數(shù)、字段計數(shù)置于壓縮后的引用類型的名稱后,或將方法計數(shù)、字段計數(shù)的值進行同等編碼變換等;下面給出一個.net文件中引用類型的壓縮結果(0)8E3B01000000//System.Runtime.CompilerServices.R皿timeHelpers(1)DB8C01000000〃HelloWorld.exe.3805F8269D52A5B2.(2)81CE00000000〃System.VoidzSystem.StringzSystem.BooleanzSystem.MarshalByRefObjectzSystem.Version(3)271101000000/(4)272200000100/(5)306401000000/(6)34B601000000/(7)C06101000000〃System.Int32(8)A24500000000〃System.Byte(9)441000000000〃System.Array(10)497001000000〃System.Object(11)ED8800000000〃System.ValueType(12)A1FA01000000〃System.Type(13)CB0F01000000//SmartCard.Runtime.Remoting.Channels.APDU.APDUServerCha皿el(14)D9F801000000//System.Runtime.Remoting.Channels.Cha皿elServices(15)F55B01000000//System.Runtime.Remoting.RemotingConfiguration上述數(shù)據(jù)均采用的是小端的表示方式,前兩個字節(jié)為壓縮后的引用類型的名稱,中間兩個字節(jié)為方法計數(shù),后兩個字節(jié)為字段計數(shù),"〃"后為.net文件中引用類型名稱字符串,通過對比可以得出,本實施例所提供的方法具有較好的壓縮效果,可以通過對引用類型的壓縮使.net文件占用的存儲空間減小,可以降低.net文件的使用受存儲空間的限制。需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。此外,上述可執(zhí)行指令可以存儲于存儲介質中,術語"存儲介質"可以表示用于存儲數(shù)據(jù)的一種或多種裝置,包括只讀存儲器(ROM)、隨機存取存儲器(RAM)、磁RAM、磁心存儲器、磁盤存儲介質、光存儲介質、閃存裝置和/或用于存儲信息的其他機器可讀介質。術語"機器可讀介質"包括但不限于便攜式或固定存儲裝置、光存儲裝置、無線通道或能夠存儲、容納、或承載指令和/或數(shù)據(jù)的各種其他介質。另外,可以通過硬件、軟件、固件、中間件、微碼、硬件描述語言或其組合來實現(xiàn)實施例。當用軟件、固件、中間件或微碼來實現(xiàn)時,可以在諸如存儲介質的機器可讀介質中存儲用于執(zhí)行必要任務的程序代碼或碼段。(多個)處理器可以執(zhí)行必要任務。碼段可以表示進程、函數(shù)、子程序、程序、例行程序、子例行程序、模塊、對象、軟件包、類、或指令、數(shù)據(jù)結構、或程序語言的任意組合。通過傳輸和/或接收信息、數(shù)據(jù)、自變量、或存儲內容來將碼段耦合到另一碼段或硬件電路。信息、自變量、參數(shù)、數(shù)據(jù)等可以經由包括存儲器共享、消息傳遞、令牌傳遞、網絡傳輸?shù)鹊娜我夂线m方式來傳遞、傳輸、或傳送。顯然,本領域的技術人員應該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計算裝置來實現(xiàn),它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成的網絡上,可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實現(xiàn),從而,可以將它們存儲在存儲裝置中由計算裝置來執(zhí)行,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結合。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領域的技術人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內。權利要求一種.net文件中引用類型的壓縮方法,其特征在于,所述方法包括獲取.net文件中使用的引用類型的名稱,并進行壓縮,得到壓縮后的引用類型的名稱;統(tǒng)計所述引用類型的方法計數(shù)和字段計數(shù);按照預先確定的格式對所述壓縮后的引用類型的名稱、所述方法計數(shù)和所述字段計數(shù)進行組合,得到所述引用類型的壓縮結果。2.根據(jù)權利要求1所述的方法,其特征在于,所述獲取.net文件中使用的引用類型的名稱的步驟包括獲取.net文件中第一元數(shù)據(jù)表;從所述第一元數(shù)據(jù)表中讀取所述.net文件中使用的引用類型的名稱的地址信息;根據(jù)所述地址信息讀取所述引用類型的名稱。3.根據(jù)權利要求1所述的方法,其特征在于,所述獲取.net文件中使用的引用類型的名稱,并進行壓縮的步驟包括獲取.net文件中使用的引用類型的名稱;根據(jù)獲取的引用類型的名稱生成引用類型名稱字符串后進行壓縮。4.根據(jù)權利要求3所述的方法,其特征在于,所述根據(jù)獲取的引用類型的名稱生成引用類型名稱字符串的步驟包括將獲取的引用類型的名稱轉換成預定的編碼格式,生成引用類型名稱字符串。5.根據(jù)權利要求3所述的方法,其特征在于,所述根據(jù)獲取的引用類型的名稱生成引用類型名稱字符串的步驟包括獲取所述引用類型所屬的命名空間名稱;將所述命名空間名稱與所述引用類型的名稱組合,生成引用類型名稱字符串。6.根據(jù)權利要求3所述的方法,其特征在于,所述對所述引用類型名稱字符串進行壓縮的步驟包括對所述引用類型的名稱字符串進行散列運算得到散列值;取所述散列值中預定的字節(jié)作為壓縮后的所述引用類型的名稱。7.根據(jù)權利要求6所述的方法,其特征在于,所述散列運算采用的算法為MD5、SHA-1或SHA-2。8.根據(jù)權利要求1所述的方法,其特征在于,所述統(tǒng)計所述引用類型的方法計數(shù)和字段計數(shù)的步驟包括獲取第二元數(shù)據(jù)表;對所述第二元數(shù)據(jù)表的每一行數(shù)據(jù)執(zhí)行下述操作讀取所述第二元數(shù)據(jù)表中當前行數(shù)據(jù)所指向的引用類型;當所述當前行數(shù)據(jù)指向的引用類型的名稱與獲取的引用類型的名稱一致時,根據(jù)所述當前行數(shù)據(jù)的特征標識值判斷所述當前行數(shù)據(jù)記錄的是否為方法,如果是,將所述引用類型的方法計數(shù)加1;否則,將所述引用類型的字段計數(shù)加1。9.根據(jù)權利要求1所述的方法,其特征在于,所述預先確定的格式為固定長度的字節(jié),所述固定長度的字節(jié)包括三部分,其中,第一部分為所述壓縮后的引用類型的名稱,第二部分為所述方法計數(shù),第三部分為所述字段計數(shù)。10.—種.net文件中引用類型的壓縮裝置,其特征在于,所述裝置包括引用類型名稱獲取模塊,用于獲取.net文件中使用的引用類型的名稱;壓縮模塊,用于對所述引用類型名稱獲取模塊獲取的引用類型的名稱進行壓縮,得到壓縮后的引用類型的名稱;統(tǒng)計模塊,用于統(tǒng)計所述引用類型名稱獲取模塊獲取的引用類型的方法計數(shù)和字段計數(shù);組合模塊,用于按照預先確定的格式對所述壓縮模塊壓縮后的引用類型的名稱、所述統(tǒng)計模塊統(tǒng)計出的方法計數(shù)和字段計數(shù)進行組合,得到所述引用類型的壓縮結果。11.根據(jù)權利要求IO所述的裝置,其特征在于,所述引用類型名稱獲取模塊包括第一元數(shù)據(jù)表獲取單元,用于獲取.net文件中第一元數(shù)據(jù)表;地址信息讀取單元,用于從所述第一元數(shù)據(jù)表獲取單元獲取的第一元數(shù)據(jù)表中讀取所述.net文件中使用的引用類型名稱的地址信息;引用類型名稱讀取單元,用于根據(jù)所述地址信息讀取單元讀取的地址信息讀取所述引用類型的名稱。全文摘要本發(fā)明公開了一種.net文件中引用類型的壓縮方法和裝置,根據(jù)本發(fā)明的.net文件中引用類型的壓縮方法包括獲取.net文件中使用的引用類型的名稱,并進行壓縮,得到壓縮后的引用類型的名稱;統(tǒng)計所述引用類型的方法計數(shù)和字段計數(shù);對所述壓縮后的引用類型的名稱、所述方法計數(shù)和所述字段計數(shù)進行組合,得到所述引用類型的壓縮結果。通過對引用類型進行壓縮,可以有效地降低.net文件占用的存儲空間,使.net文件可以在小容量存儲介質(例如智能卡)上存儲并運行,進而增強了小容量存儲介質(例如智能卡)的功能。文檔編號G06F17/30GK101794221SQ20091024416公開日2010年8月4日申請日期2009年12月30日優(yōu)先權日2009年12月30日發(fā)明者于華章,陸舟申請人:北京飛天誠信科技有限公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
宁南县| 浪卡子县| 龙南县| 福海县| 永善县| 尉氏县| 阜康市| 兰考县| 高要市| 金溪县| 和硕县| 浦城县| 晋州市| 台中县| 四川省| 横山县| 洛川县| 岐山县| 五指山市| 龙陵县| 成都市| 彰化县| 南皮县| 衡山县| 沽源县| 韩城市| 天津市| 鹰潭市| 电白县| 新宁县| 鞍山市| 上林县| 怀来县| 滁州市| 繁峙县| 玛多县| 容城县| 讷河市| 阳谷县| 长宁区| 准格尔旗|