国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

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

      文檔序號(hào):6585468閱讀:356來源:國知局

      專利名稱::.net文件中定義類型的壓縮方法和裝置的制作方法
      技術(shù)領(lǐng)域
      :本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,具體而言,涉及一種.net文件中定義類型的壓縮方法和裝置。
      背景技術(shù)
      :.Net是微軟的新一代技術(shù)平臺(tái),是全新的基于互聯(lián)網(wǎng)的跨語言軟件開發(fā)平臺(tái),順應(yīng)了當(dāng)今軟件工業(yè)分布式計(jì)算、面向組件、企業(yè)級(jí)應(yīng)用、軟件服務(wù)化和以Web為中心等大趨勢。.Net并非開發(fā)語言,但是在.Net開發(fā)平臺(tái)上可以支持多種開發(fā)語言,如C#語言丄++、VisualBasic、Jscript等。智能卡是一種大小和普通名片相仿的塑料卡片,內(nèi)含一塊直徑lcm左右的硅芯片,具有存儲(chǔ)信息和進(jìn)行復(fù)雜運(yùn)算的功能。它被廣泛地應(yīng)用于電話卡、金融卡、身份識(shí)別卡以及移動(dòng)電話、付費(fèi)電視等領(lǐng)域。其中,智能卡的芯片上集成了微處理器、存儲(chǔ)器以及輸入/輸出單元等,使得智能卡被認(rèn)為是世界上最小的電子計(jì)算機(jī)。并且在智能卡上擁有一整套性能較強(qiáng)的安全保密控制機(jī)制,安全控制程序被固化在只讀存儲(chǔ)器中,因而具有無法復(fù)制密碼等可靠的安全保證。智能卡與普通磁卡相比,還具有信息存儲(chǔ)容量大,可利用微處理器來增加卡片功能等優(yōu)點(diǎn)。.Net卡是一種含有可以運(yùn)行.Net程序的.Net卡虛擬機(jī)的微處理器智能卡。所謂虛擬機(jī),是指可以把它想象成一臺(tái)用軟件來模擬的機(jī)器,在這臺(tái)機(jī)器里有處理器、內(nèi)存、寄存器等各種硬件,模擬運(yùn)行各種指令,在這臺(tái)機(jī)器上運(yùn)行的軟件對(duì)運(yùn)行環(huán)境沒有特殊要求,所以虛擬機(jī)對(duì)在它上運(yùn)行的程序來說是透明的。例如,x86虛擬機(jī)模擬的是x86指令程序的運(yùn)行環(huán)境,c51虛擬機(jī)模擬的是c51指令程序的運(yùn)行環(huán)境。.net程序包括命名空間、引用類型、定義類型、定義方法、引用方法、I"IntermediateLangimge,中間語言)代碼等。但是目前的智能卡由于體積和存儲(chǔ)芯片的限制,其存儲(chǔ)空間仍然有限,隨著軟件的發(fā)展,部分功能大的程序占用存儲(chǔ)空間較大,對(duì)于很多的.net程序并不能進(jìn)行存儲(chǔ)和運(yùn)行。綜上所述,相關(guān)技術(shù)中的.net程序壓縮效果較差,不能很好地在小容量的存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)和運(yùn)行,且針對(duì)該問題目前尚未提出有效的解決方案。
      發(fā)明內(nèi)容本發(fā)明旨在提供一種.net文件中定義類型的壓縮方法和裝置,能夠解決.net程序壓縮效果較差,不能很好地在小容量的存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)和運(yùn)行等問題。在本發(fā)明的實(shí)施例中,提供了一種.net文件中定義類型的壓縮方法,所述方法包括獲取.net文件中使用的定義類型包含的信息;根據(jù)所述定義類型包含的信息獲取所述定義類型的指定信息和計(jì)數(shù)信息;5對(duì)所述指定信息進(jìn)行壓縮;將壓縮后的指定信息和所述計(jì)數(shù)信息作為所述定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。本發(fā)明實(shí)施例還提供了一種.net文件中定義類型的壓縮裝置,所述裝置包括定義類型信息獲取模塊,用于獲取.net文件中使用的定義類型包含的信息;根據(jù)所述定義類型包含的信息獲取所述定義類型的指定信息和計(jì)數(shù)信息;壓縮模塊,用于對(duì)所述定義類型信息獲取模塊獲取的指定信息進(jìn)行壓縮;壓縮結(jié)果存儲(chǔ)模塊,用于將所述壓縮模塊壓縮后的指定信息和所述定義類型信息獲取模塊獲取的計(jì)數(shù)信息作為所述定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。本實(shí)施例采用對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),克服了.net文件占用的存儲(chǔ)容量大的問題,進(jìn)而使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。明的示意此處所說明的附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā)性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中圖1示出了實(shí)施例1提供的.net文件中定義類型的壓縮裝置net文件中定義類型的壓縮裝置net文件中定義類型的壓縮裝置net文件中定義類型的壓縮裝置net文件中定義類型的壓縮裝置net文件中定義類型的壓縮方法流程圖;圖7示出了實(shí)施例7提供的.net文件的結(jié)構(gòu)示意圖;圖8示出了實(shí)施例7提供的.net文件中定義類型的壓縮方法流程圖。圖2示出了實(shí)施例2提供的圖3示出了實(shí)施例3提供的圖4示出了實(shí)施例4提供的圖5示出了實(shí)施例5提供的圖6示出了實(shí)施例6提供的具體實(shí)施例方式下面將參考附圖并結(jié)合實(shí)施例,來詳細(xì)說明本發(fā)明。實(shí)施例1參見圖l,本實(shí)施例提供了一種.net文件中定義類型的壓縮裝置,該裝置包括定義類型信息獲取模塊102,用于獲取.net文件中使用的定義類型包含的信息;根據(jù)該定義類型包含的信息獲取該定義類型的指定信息和計(jì)數(shù)信息;壓縮模塊104,用于對(duì)定義類型信息獲取模塊102獲取的指定信息進(jìn)行壓縮;壓縮結(jié)果存儲(chǔ)模塊106,用于將壓縮模塊104壓縮后的指定信息和定義類型信息獲取模塊102獲取的計(jì)數(shù)信息作為該定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。其中,定義類型信息獲取模塊102的具體實(shí)現(xiàn)可以是先讀取.net文件中的定義類型所在的元數(shù)據(jù)表,即元數(shù)據(jù)表TypeDef;再從元數(shù)據(jù)表TypeDef中獲取.net文件中使用的定義類型包含的信息。本實(shí)施例中該定義類型包含的信息包括該定義類型的標(biāo)識(shí)、該定義類型的名稱的偏移量、該定義類型中的方法的偏移量;當(dāng)該定義類型中使用了字段時(shí),該定義類型包含的信息中還可以包括該定義類型中的字段的偏移量;這些信息都可以通過讀取元數(shù)據(jù)表TypeDef中的數(shù)據(jù)得到,在元數(shù)據(jù)表TypeDef中,每行數(shù)據(jù)表示一個(gè)定義類型,每行數(shù)據(jù)共14個(gè)字節(jié),這14個(gè)字節(jié)記錄的信息為前4個(gè)字節(jié)為Flags(定義類型標(biāo)識(shí)),5、6字節(jié)為定義類型名稱在"ftStrings"流中的偏移量,7、8字節(jié)為該定義類型所屬的命名空間名稱在.net文件里"ftStrings"流中的偏移量,9、10字節(jié)為該定義類型的所繼承的父類的偏移量,11、12字節(jié)為該定義類型包含的字段在元數(shù)據(jù)表Field表中的偏移量,13、14字節(jié)為該定義類型所包含的方法在元數(shù)據(jù)表Method表中的偏移量。根據(jù)本實(shí)施例中該定義類型包含的信息,上述指定信息包括該定義類型的標(biāo)識(shí)、該定義類型的名稱,還可以包括該定義類型中的字段對(duì)應(yīng)的信息;其中,該定義類型的名稱可以根據(jù)上述該定義類型的名稱的偏移量在.net文件對(duì)應(yīng)的數(shù)據(jù)流中查找到,該定義類型的字段對(duì)應(yīng)的信息也可以通過上述字段的偏移量在元數(shù)據(jù)表Field表中查找到;計(jì)數(shù)信息包括該定義類型的方法重載信息、該定義類型中包含的方法計(jì)數(shù)和字段計(jì)數(shù)等。本實(shí)施例的壓縮模塊104對(duì)指定信息進(jìn)行壓縮時(shí),可以根據(jù)壓縮的具體對(duì)象選擇壓縮方法,例如對(duì)定義類型的標(biāo)識(shí)進(jìn)行壓縮時(shí),可以先將定義類型的標(biāo)識(shí)分為類型標(biāo)識(shí)、訪問標(biāo)識(shí)和描述性標(biāo)識(shí);然后,將類型標(biāo)識(shí)、訪問標(biāo)識(shí)和描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,得到的數(shù)據(jù)作為該定義類型的標(biāo)識(shí)的壓縮結(jié)果;對(duì)定義類型的名稱進(jìn)行壓縮時(shí),可以對(duì)定義類型的名稱進(jìn)行哈希運(yùn)算,從運(yùn)算結(jié)果中提取約定的字節(jié)作為該定義類型的名稱的壓縮結(jié)果;對(duì)定義類型中的字段對(duì)應(yīng)的信息(字段的名稱、字段的標(biāo)識(shí)和字段的類型)進(jìn)行壓縮時(shí),根據(jù)字段對(duì)應(yīng)的信息內(nèi)容分為以下三種情況D對(duì)上述字段的名稱進(jìn)行哈希運(yùn)算,從運(yùn)算結(jié)果中提取約定的字節(jié)作為該字段的名稱的壓縮結(jié)果;2)將上述字段的標(biāo)識(shí)分為訪問標(biāo)識(shí)和描述性標(biāo)識(shí),對(duì)上述字段的標(biāo)識(shí)中的訪問標(biāo)識(shí)和描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,得到的結(jié)果作為該字段的標(biāo)識(shí)的壓縮結(jié)果;3)將上述字段的類型在壓縮后的類型中的偏移量作為該字段的類型的壓縮結(jié)果。由上述內(nèi)容可知,壓縮后的定義類型中包括定義類型名稱的壓縮結(jié)果、類型標(biāo)識(shí)的壓縮結(jié)果、類型中所包含的字段計(jì)數(shù)、方法計(jì)數(shù)、方法重載信息、類型中的字段對(duì)應(yīng)的信息等。這些信息可以按照預(yù)先確定的格式排列,也可以任意排列。本實(shí)施例通過對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。實(shí)施例2參見圖2,本實(shí)施例提供了一種.net文件中定義類型的壓縮裝置,該裝置包括定義類型信息獲取模塊102,用于獲取.net文件中使用的定義類型包含的信息;根據(jù)該定義類型包含的信息獲取該定義類型的指定信息和計(jì)數(shù)信息;其中,定義類型信息獲取模塊102的具體實(shí)現(xiàn)與實(shí)施例1相同,這里不再贅述,本實(shí)施例中該定義類型包含的信息包括該定義類型的標(biāo)識(shí)、該定義類型的名稱的偏移量、該定義類型中的方法的偏移量和定義類型所繼承的父類的偏移量;該定義類型包含的信息中還可以包括該定義類型中的字段的偏移量;指定信息包括該定義類型的標(biāo)識(shí)、該定義類型的名稱,還可以包括該定義類型中的字段對(duì)應(yīng)的信息;計(jì)數(shù)信息包括該定義類型的方法重載信息、該定義類型中包含的方法計(jì)數(shù)和字段計(jì)數(shù)等。壓縮模塊104,用于對(duì)定義類型信息獲取模塊102獲取的指定信息進(jìn)行壓縮;第一判斷模塊105,用于判斷定義類型信息獲取模塊102中的定義類型所繼承的父類是否已壓縮;父類偏移量獲取模塊107,用于當(dāng)?shù)谝慌袛嗄K105判斷的結(jié)果是繼承的父類已壓縮,獲取繼承的父類的偏移量;如果繼承的父類沒有壓縮,對(duì)繼承的父類進(jìn)行壓縮,并為壓縮后的父類分配偏移量;壓縮結(jié)果存儲(chǔ)模塊106,用于將壓縮模塊104壓縮后的指定信息、定義類型信息獲取模塊102獲取的計(jì)數(shù)信息和父類偏移量獲取模塊107獲取的繼承的父類偏移量作為該定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。本實(shí)施例中的壓縮模塊104對(duì)指定信息進(jìn)行壓縮時(shí)的具體實(shí)現(xiàn)方法可以和實(shí)施例1中的方法相同,這里不再詳述。本實(shí)施例中當(dāng)前定義類型所繼承的父類的類型可能為引用類型,該引用類型存儲(chǔ)于元數(shù)據(jù)表TypeRef中,此時(shí),可以從該元數(shù)據(jù)表TypeRef中直接查到所繼承的父類的偏移量;或者,當(dāng)前定義類型所繼承的父類的類型可能也為定義類型,此時(shí),需要先判斷所繼承的父類是否壓縮,如果沒有壓縮,則先壓縮再分配一個(gè)偏移量,如果已經(jīng)壓縮,則直接獲取其偏移量。由上述內(nèi)容可知,本實(shí)施例壓縮后的定義類型中包括定義類型名稱的壓縮結(jié)果、類型標(biāo)識(shí)的壓縮結(jié)果、類型中所包含的字段計(jì)數(shù)、類型中方法重載信息、繼承的父類偏移量、類型中字段的信息等。這些信息可以按照預(yù)先確定的格式排列,也可以任意排列。本實(shí)施例通過對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。實(shí)施例3參見圖3,本實(shí)施例提供了一種.net文件中定義類型的壓縮裝置,該裝置包括定義類型信息獲取模塊102、壓縮模塊104、第二判斷模塊108、接口信息獲取模塊109和壓縮結(jié)果存儲(chǔ)模塊106;其中,定義類型信息獲取模塊102和壓縮模塊104的功能和實(shí)施例1、實(shí)施例2中對(duì)應(yīng)模塊的功能相同,這里不再贅述;第二判斷模塊108,用于判斷定義類型信息獲取模塊102中的定義類型是否有繼承的接口;接口信息獲取模塊109,用于當(dāng)?shù)诙袛嗄K108判斷的結(jié)果是該定義類型有繼承的接口,獲取該定義類型繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù);壓縮結(jié)果存儲(chǔ)模塊106,用于將壓縮模塊104壓縮后的指定信息、定義類型信息獲取模塊102獲取的計(jì)數(shù)信息、接口信息獲取模塊109獲取的繼承的接口的偏移量和繼承的接口的個(gè)數(shù)作為該定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。由上述內(nèi)容可知,本實(shí)施例壓縮后的定義類型中包括定義類型名稱的壓縮結(jié)果、類型標(biāo)識(shí)的壓縮結(jié)果、類型所繼承的接口計(jì)數(shù)、類型中所包含的字段計(jì)數(shù)、類型中方法重載信息、類型所繼承的接口壓縮后的偏移、類型中字段的信息等。這些信息可以按照預(yù)先確定的格式排列,也可以任意排列。本實(shí)施例通過對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。實(shí)施例4參見圖4,本實(shí)施例提供了一種.net文件中定義類型的壓縮裝置,該裝置包括定義類型信息獲取模塊102、壓縮模塊104、第三判斷模塊110、偏移量獲取模塊111和壓縮結(jié)果存儲(chǔ)模塊106;其中,定義類型信息獲取模塊102和壓縮模塊104的功能和實(shí)施例1、實(shí)施例2中對(duì)應(yīng)模塊的功能相同,這里不再贅述;第三判斷模塊IIO,用于判斷定義類型信息獲取模塊102中的定義類型是否是嵌套類型;偏移量獲取模塊lll,用于當(dāng)?shù)谌袛嗄KIIO判斷的結(jié)果為該定義類型是嵌套類型時(shí),獲取該嵌套類型所在的類型壓縮后的偏移量;壓縮結(jié)果存儲(chǔ)模塊106,用于將壓縮模塊104壓縮后的指定信息、定義類型信息獲取模塊102獲取的計(jì)數(shù)信息、偏移量獲取模塊111獲取的該定義類型所在的類型壓縮后的偏移量作為該定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。由上述內(nèi)容可知,本實(shí)施例壓縮后的定義類型中包括定義類型名稱的壓縮結(jié)果、類型標(biāo)識(shí)的壓縮結(jié)果、類型中所包含的字段計(jì)數(shù)、類型中方法重載信息、嵌套類型所在的類型的偏移量、類型中字段的信息等。這些信息可以按照預(yù)先確定的格式排列,也可以任意排列。本實(shí)施例通過對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。實(shí)施例5參見圖5,本實(shí)施例提供了一種.net文件中定義類型的壓縮裝置,該裝置包括實(shí)施例1-4中的各個(gè)模塊,其中,定義類型信息獲取模塊102、壓縮模塊104、第一判斷模塊105、父類偏移量獲取模塊107、第二判斷模塊108、接口信息獲取模塊109、第三判斷模塊110、偏移量獲取模塊111的功能與上述實(shí)施例中對(duì)應(yīng)模塊的功能相同,這里不再詳述;壓縮結(jié)果存儲(chǔ)模塊106,用于將壓縮模塊104壓縮后的指定信息、定義類型信息獲取模塊102獲取的計(jì)數(shù)信息、父類偏移量獲取模塊107獲取的繼承的父類壓縮后的偏移量、接口信息獲取模塊109獲取的繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù)、偏移量獲取模塊111獲取該定義類型所在的類型壓縮后的偏移量作為該定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。由上述內(nèi)容可知,本實(shí)施例壓縮后的定義類型中包括定義類型名稱的壓縮結(jié)果、類型標(biāo)識(shí)的壓縮結(jié)果、類型中所包含的字段計(jì)數(shù)、類型中方法重載信息、繼承的父類偏移量、繼承的接口的偏移量、繼承的接口的個(gè)數(shù)、定義類型所在的類型壓縮后的偏移量、類型中字段的信息等。這些信息可以按照預(yù)先確定的格式排列,也可以任意排列。本實(shí)施例通過對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。實(shí)施例6參見圖6,本實(shí)施例提供了一種.net文件中定義類型的壓縮方法,該方法以通過實(shí)施例1通過的壓縮裝置實(shí)現(xiàn)為例進(jìn)行說明,該方法包括步驟S202:定義類型信息獲取模塊102獲取.net文件中使用的定義類型包含的信息;步驟S204:定義類型信息獲取模塊102根據(jù)該定義類型包含的信息獲取該定義類型的指定信息和計(jì)數(shù)信息;步驟S206:壓縮模塊104對(duì)上述指定信息進(jìn)行壓縮;步驟S208:壓縮結(jié)果存儲(chǔ)模塊106將壓縮后的指定信息和計(jì)數(shù)信息作為該定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。其中,定義類型信息獲取模塊102獲取的定義類型包含的信息是通過如下方式得到的先讀取.net文件中的定義類型元數(shù)據(jù)表,即元數(shù)據(jù)表TypeDef;再從元數(shù)據(jù)表TypeDef中獲取.net文件中使用的定義類型包含的信息。本實(shí)施例中該定義類型包含的信息包括該定義類型的標(biāo)識(shí)、該定義類型的名稱的偏移量、該定義類型中的方法的偏移量;當(dāng)該定義類型中使用了字段時(shí),該定義類型包含的信息中還可以包括該定義類型中的字段的偏移量;這些信息都可以通過讀取元數(shù)據(jù)表TypeDef中的數(shù)據(jù)得到,在元數(shù)據(jù)表TypeDef中,每行數(shù)據(jù)表示一個(gè)定義類型,每行數(shù)據(jù)共14個(gè)字節(jié),這14個(gè)字節(jié)記錄的信息為前4個(gè)字節(jié)為Flags(定義類型標(biāo)識(shí)),5、6字節(jié)為定義類型名稱在"ftStrings"流中的偏移量,7、8字節(jié)為該定義類型所屬的命名空間名稱在.net文件里"ftStrings"流中的偏移量,9、10字節(jié)為該定義類型的所繼承的父類的偏移量,11、12字節(jié)為該定義類型包含的字段的偏移量,13、14字節(jié)為該定義類型所包含的方法的偏移量。上述指定信息和計(jì)數(shù)信息與實(shí)施例1中對(duì)應(yīng)的信息相同,這里不再詳述。優(yōu)選地,本實(shí)施例中將定義類型的標(biāo)識(shí)分為類型標(biāo)識(shí)、訪問標(biāo)識(shí)和描述性標(biāo)識(shí);相應(yīng)地,步驟S206中的壓縮模塊104對(duì)上述指定信息進(jìn)行壓縮的步驟包括對(duì)所述類型標(biāo)識(shí)、訪問標(biāo)識(shí)和描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,將得到的數(shù)據(jù)作為定義類型的標(biāo)識(shí)的壓縮結(jié)果;對(duì)所述定義類型的名稱進(jìn)行哈希運(yùn)算,從運(yùn)算結(jié)果中提取約定的字節(jié)作為定義類型的名稱的壓縮結(jié)果。當(dāng)該.net文件中的當(dāng)前定義類型中包含字段時(shí),該定義類型包含的信息還包括該定義類型中的字段的偏移量;相應(yīng)地,上述指定信息還包括該定義類型中的字段對(duì)應(yīng)的信息;計(jì)數(shù)信息還包括該定義類型的字段計(jì)數(shù)。優(yōu)選地,本實(shí)施例中的字段對(duì)應(yīng)的信息包括字段的名稱、字段的標(biāo)識(shí)和字段的類型;其中,所述字段的標(biāo)識(shí)分為訪問標(biāo)識(shí)和描述性標(biāo)識(shí);相應(yīng)地,步驟S206中的壓縮模塊104對(duì)上述指定信息進(jìn)行壓縮的步驟包括對(duì)該字段的名稱進(jìn)行哈希運(yùn)算,從運(yùn)算結(jié)果中提取約定的字節(jié)作為該字段的名稱的壓縮結(jié)果;對(duì)該字段的標(biāo)識(shí)中的訪問標(biāo)識(shí)和描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,得到的結(jié)果作為該字段的標(biāo)識(shí)的壓縮結(jié)果;將該字段的類型在壓縮后的類型中的偏移量作為該字段的類型的壓縮結(jié)果。優(yōu)選地,定義類型包含的信息包括該定義類型所繼承的父類的偏移量;相應(yīng)地,上述方法還包括判斷該定義類型所繼承的父類是否已壓縮,如果是,獲取所繼承的父類的偏移量;否則,對(duì)所繼承的父類進(jìn)行壓縮并為壓縮后的所繼承的父類分配偏移量;相應(yīng)地,上述定義類型的壓縮結(jié)果中還包括壓縮后的所述父類的偏移量。優(yōu)選地,上述方法還包括判斷該定義類型是否有繼承的接口;如果有,獲取該定義類型所繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù);相應(yīng)地,該定義類型的壓縮結(jié)果中還包括上述繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù)。優(yōu)選地,上述方法還包括判斷該定義類型是否是嵌套類型,如果是,獲取該定義類型所在的類型壓縮后的偏移量;相應(yīng)地,該定義類型的壓縮結(jié)果中還包括上述定義類型所在的類型壓縮后的偏移通過上述方法,對(duì)每個(gè)定義類型壓縮后的數(shù)據(jù)進(jìn)行組織,其格式為定義類型名稱的hash值(定義類型名稱的壓縮結(jié)果)、類型標(biāo)識(shí)的壓縮結(jié)果、類型所繼承的接口計(jì)數(shù)、類型父類的偏移量、類型中所包含的字段計(jì)數(shù)、類型中方法重載信息、定義類型所在類型壓縮后的偏移量、類型所繼承接口壓縮后的偏移量、類型中字段對(duì)應(yīng)的信息等;其中,類型所繼承的接口壓縮后的偏移量、類型中字段對(duì)應(yīng)的信息可以有多條,當(dāng)有多條時(shí),依次排列當(dāng)前定義類型所繼承的接口偏移量、字段對(duì)應(yīng)的信息;另外,定義類型所在類型壓縮后的偏移量、類型所繼承接口壓縮后的偏移量、類型中字段對(duì)應(yīng)的信息這三者中可能部分存在或都不存在,此時(shí),該定義類型中不寫入這些信息。本實(shí)施例通過對(duì).net文件中的定義類型的各個(gè)部分進(jìn)行壓縮,并將各部分的壓縮結(jié)果按照預(yù)先確定的格式存儲(chǔ),可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。實(shí)施例7本實(shí)施例提供了一種.net文件中定義類型的壓縮方法,該壓縮方法以一個(gè)具體應(yīng)用實(shí)例為例進(jìn)行說明,在此應(yīng)用實(shí)例中,涉及到.net文件中的引用類型的壓縮及存儲(chǔ)的部分,本實(shí)例中引用類型的壓縮結(jié)果為已知的內(nèi)容,可以直接使用。本實(shí)施例以將下面的代碼編譯后的文件為例,說明.net文件中定義類型的壓縮方法。部分代碼如下0113]namespaceMyCompany.MyOnCardApp0114]{publicclassMyService:MarshalByRefObject0115]0116]0117]0118]0119]0120]0121]0122]0123]0124]0125]0126]0127]0128]0129]0130]0131]0132]0133]0134]0135]0136]0137]0138]0139]0140]0141]0142]0143]0144]0145]0146]publicStringMyS咖pleMethod()StringstrHello=〃HelloWorld!〃returnstrHello+callCoimt.ToString()publicclassClassApublicclassClassC:ClassB,IA,IBstaticStringstrField;Int32iField;publicClassC(Stringstr1,intstrFieldiField.....''.publicStringTestC()return皿llprivatestructStructBpublicclassClassBpublicinterfaceIApublicinterfaceIB12{}}對(duì)上述代碼使用.net平臺(tái)編譯后得到helloworld.exe文件,并以二進(jìn)制的形式存儲(chǔ)在硬盤上,該二進(jìn)制文件為.net文件,.net文件可以運(yùn)行在Windows環(huán)境下并且符合PE(PortableExecutable,可移植可執(zhí)行)文件格式,PE格式是Windows的可執(zhí)行文件的格式,Windows中的.exe文件、.dll文件都是PE格式。參見圖7,為.net文件的結(jié)構(gòu)示意圖,該文件包括Dos頭、PE特征以及元數(shù)據(jù)(MetaData),元數(shù)據(jù)中包括元數(shù)據(jù)頭(MetaDataHeader)、元數(shù)據(jù)表(MetaDataTables)等。參見圖8,本實(shí)施例提供的.net文件中定義類型的壓縮方法包括步驟S301:定位.net文件中的元數(shù)據(jù)表(MetadataTables)的起始地址,并獲取現(xiàn)存表位向量;其中,元數(shù)據(jù)表為.net文件的一部分,定位元數(shù)據(jù)表的過程如下1)定位.net文件Dos頭,得到Dos頭標(biāo)識(shí)0x5a4d;2)從Dos頭標(biāo)識(shí)后開始跳過第一約定個(gè)字節(jié),讀出PE特征的偏移地址,得到PE特征的偏移地址0x00000080;在本實(shí)施例中,第一約定個(gè)字節(jié)為0x003a個(gè)字節(jié);3)根據(jù)PE特征偏移地址0x00000080定位PE特征,定位得到PE特征0x00004550;4)從PE特征后開始,偏移第二約定個(gè)字節(jié)后讀取四個(gè)字節(jié),在本實(shí)施例中,以32位機(jī)為例進(jìn)行說明,第二約定個(gè)字節(jié)為從PE特征處向后偏移0x0074字節(jié)后,讀出的數(shù)據(jù)為0x00000010,此值說明該二進(jìn)制文件中存在0x10個(gè)目錄,且包含.net數(shù)據(jù);其中,.net文件的元數(shù)據(jù)頭地址寫在上述第0x0F個(gè)目錄中;若是在64位機(jī)中,則第二約定個(gè)字節(jié)為0x0084個(gè)字節(jié);5)從上述數(shù)據(jù)0x00000010開始,向后偏移第三約定個(gè)字節(jié)讀取八個(gè)字節(jié)數(shù)據(jù),在本實(shí)施例中,優(yōu)選地,第三約定個(gè)字節(jié)為0x0070個(gè)字節(jié),在此八個(gè)字節(jié)數(shù)據(jù)中,前四個(gè)字節(jié)為0x00002008,為.net文件中.net數(shù)據(jù)頭的相對(duì)虛擬地址,后四個(gè)字節(jié)為0x00000048,為.net數(shù)據(jù)頭的長度;6)根據(jù).net文件中.net數(shù)據(jù)頭的相對(duì)虛擬地址0x00002008得到線性地址0x00000208并讀取.net數(shù)據(jù)頭得到如下數(shù)據(jù)48000000020005000C2200009C0A0000需要說明的是,上述數(shù)據(jù)采用小端的存儲(chǔ)方式,例如,上述數(shù)據(jù)前4個(gè)字節(jié)0x48000000轉(zhuǎn)換成大端的存儲(chǔ)方式為0x0000048,表示該數(shù)據(jù)的長度;其中,根據(jù).net元數(shù)據(jù)頭的長度0x00000048讀取72個(gè)字節(jié)的數(shù)據(jù)。在本實(shí)施例中,線性地址為.net數(shù)據(jù)在.net文件中的地址,相對(duì)虛擬地址為相對(duì)于PE載入點(diǎn)的內(nèi)存偏移,線性地址和相對(duì)虛擬地址的轉(zhuǎn)換關(guān)系為線性地址=相對(duì)虛擬地址_節(jié)相對(duì)虛擬地址+節(jié)的文件偏移,在本實(shí)施例中,讀取.net文件中.net數(shù)據(jù)目錄的節(jié)的相對(duì)虛擬地址為0x00002000,節(jié)的文件偏移為0x00000200,則線性地址=0x00002008-0x00002000+0x00000200=0x00000208;7)由.net數(shù)據(jù)頭開始向后偏移第四約定個(gè)字節(jié)后,在本實(shí)施例中第四約定個(gè)字節(jié)為從.net數(shù)據(jù)頭開始向后偏移8個(gè)字節(jié)后,讀取共8個(gè)字節(jié)數(shù)據(jù),在這8個(gè)字節(jié)中,前四個(gè)字節(jié)為0x0000220c,為元數(shù)據(jù)頭(MetaDataHeader)的相對(duì)虛擬地址,后四個(gè)字節(jié)為0x00000a9c,為元數(shù)據(jù)的長度;8)根據(jù)元數(shù)據(jù)頭的相對(duì)虛擬地址0x0000220c得到線性地址0x0000040c,根據(jù)線性地址和元數(shù)據(jù)長度讀取元數(shù)據(jù)內(nèi)容;9)由元數(shù)據(jù)頭向后讀取,當(dāng)讀取到標(biāo)志"#"(0x237E)時(shí),讀取標(biāo)志"#"之前的八個(gè)字節(jié),其中前四個(gè)字節(jié)為"#"流數(shù)據(jù)相對(duì)元數(shù)據(jù)頭的偏移,后四個(gè)字節(jié)為"#"流的長度;通過"#"流的相對(duì)偏移得到"#"流的數(shù)據(jù)區(qū)域,在"#"流中第五約定個(gè)字節(jié)開始讀取長度為8個(gè)字節(jié)的數(shù)據(jù),得到現(xiàn)存表的位向量(MaskValid)在本實(shí)施例中,現(xiàn)存表的位向量值為0x0000020920021f57,其二進(jìn)制形式為100000100100100000000000100001111101010111在本實(shí)施例中,第五約定個(gè)字節(jié)為"#"流中起始位開始算起第9個(gè)字節(jié);從低位開始讀取現(xiàn)存表的位向量,每一位代表一個(gè)元數(shù)據(jù)表,若該表存在,則相應(yīng)位上的值為1,否則為0;例如,從低位開始,第1位代表元數(shù)據(jù)表Module是否存在,如果是1,則證明存在元數(shù)據(jù)表Module,如果是0,證明不存在,在本實(shí)施例中,存在元數(shù)據(jù)表Module,并且第2位為l,表示元數(shù)據(jù)表TypeRef存在,第3位為1,表示元數(shù)據(jù)表TypeDef存在;步驟S302:定位元數(shù)據(jù)表TypeDef(定義類型);根據(jù)步驟S301中讀取出的現(xiàn)存表的位向量,從低位到高位依次記錄了.net文件中對(duì)應(yīng)的元數(shù)據(jù)表是否存在,其中,第3位代表元數(shù)據(jù)表TypeDef是否存在,如果第3位為1,則元數(shù)據(jù)表TypeDef存在,如果第3位為0,則元數(shù)據(jù)表TypeDef不存在,在本實(shí)施例中,元數(shù)據(jù)表TypeDef存在;在現(xiàn)存表位向量0x0000020920021f57之后的第9個(gè)字節(jié)開始,以四個(gè)字節(jié)為一個(gè)單位對(duì)應(yīng)的記錄了.net文件中存在的元數(shù)據(jù)表中所包含的數(shù)據(jù)行數(shù),跳過在TypeDef前面的兩個(gè)元數(shù)據(jù)表數(shù)據(jù)行數(shù)信息,在數(shù)據(jù)0x0000020920021f57后的第17個(gè)字節(jié)處開始讀取4個(gè)字節(jié),得到數(shù)據(jù)0x0000000a,此數(shù)據(jù)表示元數(shù)據(jù)表TypeDef中有10個(gè)數(shù)據(jù)行;在表示數(shù)據(jù)行數(shù)的數(shù)據(jù)后,依次存儲(chǔ)了每個(gè)元數(shù)據(jù)表的具體內(nèi)容,為元數(shù)據(jù)表區(qū)域;讀取元數(shù)據(jù)表TypeDef中內(nèi)容的過程如下根據(jù)步驟S301中讀取的現(xiàn)存表的位向量可知,在本發(fā)明實(shí)施例中元數(shù)據(jù)表TypeDef前存在元數(shù)據(jù)表Module和元數(shù)據(jù)表TypeRef,其中元數(shù)據(jù)表Module有l(wèi)個(gè)數(shù)據(jù)行、10個(gè)字節(jié),元數(shù)據(jù)表TypeRef有31個(gè)數(shù)據(jù)行、186個(gè)字節(jié),跳過表示元數(shù)據(jù)表中所包含的數(shù)據(jù)行個(gè)數(shù)的60個(gè)字節(jié)數(shù)據(jù)后,再跳過元數(shù)據(jù)表Module和元數(shù)據(jù)表TypeRef后讀取元數(shù)據(jù)表TypeDef的10個(gè)數(shù)據(jù)行、每個(gè)數(shù)據(jù)行有14個(gè)字節(jié),具體數(shù)據(jù)如下0x00000000010000000000010001000x01001000190022000500010001000x01001000380022000900020003000x01001000420022000500070006000x01001000490022000500070007000xA1000000530022000000070008000x02001000560000001400070008000x030110005D0000000D0009000A000x00000000C8030000050009000A00在元數(shù)據(jù)表TypeDef中,每個(gè)數(shù)據(jù)行中的數(shù)據(jù)代表一個(gè)定義類型,每個(gè)數(shù)據(jù)行的前4個(gè)字節(jié)為Flags(定義類型標(biāo)識(shí)),5、6字節(jié)為定義類型名稱在.net文件里"ftStrings"流中的相對(duì)偏移,7、8字節(jié)為該定義類型所屬的命名空間名稱在"ftStrings"流中的相對(duì)偏移,9、10字節(jié)為該定義類型的所繼承的父類的信息,11、12字節(jié)為該定義類型包含的第一個(gè)字段在元數(shù)據(jù)表Field中的數(shù)據(jù)行號(hào),13、14字節(jié)為該定義類型所包含的第一個(gè)方法在元數(shù)據(jù)表Method中的數(shù)據(jù)行號(hào)。在本實(shí)施例中,每一個(gè)元數(shù)據(jù)表中每一個(gè)數(shù)據(jù)行中數(shù)據(jù)的長度是固定的,根據(jù)現(xiàn)存表位向量及元數(shù)據(jù)表行數(shù)通過上述定位元數(shù)據(jù)表的方法可計(jì)算出其它元數(shù)據(jù)表在.net文件中的偏移地址。步驟S303:根據(jù)該元數(shù)據(jù)表TypeDef中的數(shù)據(jù)讀取定義類型的標(biāo)識(shí)和名稱,并分別對(duì)定義類型的標(biāo)識(shí)和名稱進(jìn)行壓縮;首先,根據(jù)讀取到元數(shù)據(jù)表TypeDef中的數(shù)據(jù),讀取定義類型的標(biāo)識(shí)并進(jìn)行壓縮;從元數(shù)據(jù)表TypeDef中讀取四個(gè)字節(jié)的定義類型的標(biāo)識(shí),根據(jù)該定義類型的標(biāo)識(shí)可知該定義類型的各項(xiàng)標(biāo)識(shí)屬性;本實(shí)施例將定義類型的標(biāo)識(shí)分為3部分類型標(biāo)識(shí)、訪問標(biāo)識(shí)、描述性標(biāo)識(shí),并重新定義了各項(xiàng)標(biāo)識(shí)屬性的值,如類型標(biāo)識(shí)包括預(yù)定義類型0x00、值類型0x01、枚舉類型0x02、數(shù)組類型0x03、類類型0x04、接口類型0x05、非托管指針類型0x06等;訪問標(biāo)識(shí)包括非公共訪問類型NotPublic(0x00)、公共訪問類型Public(0x10)、如果為嵌套類型的話還有訪問修飾標(biāo)識(shí)公共嵌套類型NestedPublic(0x20)、私有嵌套類型NestedPrivate(0x30)、家族嵌套類型NestedFamily(0x40)、程序集嵌套類型NestedAssembly(0x50)、程序集與家族嵌套類型NestedFamANDAssem(0x60)、程序集或家族嵌套類型NestedFam0RAssem(0x70);描述性標(biāo)識(shí)用于描述當(dāng)前類型中字段的一些屬性,如存在不可序列化的字段0x08,否則為0x00;本實(shí)施例對(duì)定義類型的標(biāo)識(shí)進(jìn)行壓縮的方法具體為將類型標(biāo)識(shí)、訪問標(biāo)識(shí)及描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,得到的1個(gè)字節(jié)的數(shù)據(jù)即為定義類型的標(biāo)識(shí)壓縮結(jié)果。例如,在步驟S302中讀取出的元數(shù)據(jù)表TypeDef的第8個(gè)數(shù)據(jù)行的定義類型ClassC,根據(jù)前4個(gè)字節(jié)的定義類型標(biāo)識(shí)0x00100002可知,其類型標(biāo)識(shí)為類0x04、訪問修飾標(biāo)識(shí)為NestedPub1ic(0x20)、描述性標(biāo)識(shí)為0x00,將以上屬性的值進(jìn)或運(yùn)算0x04I0x20I0x00得到0x24,將0x24作為定義類型ClassC的標(biāo)識(shí)壓縮結(jié)果。然后,根據(jù)讀取到的元數(shù)據(jù)表TypeDef中的數(shù)據(jù),讀取定義類型名稱并進(jìn)行壓縮;即根據(jù)定義類型名稱在"ftStrings"流中的相對(duì)偏移讀取出該定義類型的名稱;例如,讀取出的元數(shù)據(jù)表TypeDef中第二個(gè)數(shù)據(jù)行數(shù)據(jù)中,第5、6個(gè)字節(jié)中的值為0x0019,定位到.net文件的"#Strings"流后跳過0x0019個(gè)字節(jié)后開始讀取數(shù)據(jù),讀到0x00后結(jié)束,得到0x4D79536572766572,該數(shù)據(jù)即元數(shù)據(jù)表TypeDef中當(dāng)前定義類型的名15稱MyServer;對(duì)讀取出的定義類型名稱進(jìn)行哈希(hash)運(yùn)算,從hash運(yùn)算結(jié)果中取第六約定個(gè)字節(jié)作為定義類型壓縮后的結(jié)果,在本發(fā)明實(shí)施例中第六約定字節(jié)為hash值的前兩個(gè)字節(jié)。采用的hash算法可以是MD5、SHA-l、SHA-2等。例如,在本發(fā)明實(shí)施例中采用MD5算法對(duì)MyServer進(jìn)行hash運(yùn)算,得到OxOCBEFBC1EF0639BA18485104440F399C,取第六約定個(gè)字節(jié)OxOCBE作為元數(shù)據(jù)表TypeDef中當(dāng)前定義類型MyServer名稱的壓縮結(jié)果。另外,如果根據(jù)當(dāng)前類型的標(biāo)識(shí)判斷出當(dāng)前類型為嵌套類型,則再讀取出當(dāng)前類型所在類型的名稱,對(duì)當(dāng)前類型所在類型的名稱與當(dāng)前類型的名稱組合進(jìn)行hash運(yùn)算,從hash運(yùn)算結(jié)果中取第六約定個(gè)字節(jié)作為該當(dāng)前類型的壓縮結(jié)果;組合的方法可以是使用連接符將二者拼接到一起,或直接對(duì)這兩個(gè)類型進(jìn)行拼接,或兩個(gè)類型的名稱進(jìn)行相加、相減、異或等數(shù)學(xué)運(yùn)算。例如,以本實(shí)施例中所給的代碼為例類型ClassC嵌套在類型ClassA中,因此對(duì)ClassC進(jìn)行壓縮時(shí),先將ClassA的類型名稱與ClassC的類型名稱進(jìn)行拼接,在本實(shí)施例中使用連接符"+"進(jìn)行拼接,對(duì)ClassA+ClassC進(jìn)行hash運(yùn)算,然后取hash值的前兩個(gè)字節(jié)作為ClassC的類型名稱壓縮結(jié)果,這樣可以避免定義類型名稱的壓縮結(jié)果出現(xiàn)重復(fù)的情況;其中,讀取出ClassA的名稱為0x0042,ClassC的名稱為0x0056,對(duì)ClassA+ClassC使用MD5算法進(jìn)行hash運(yùn)算,得到0x9B8DE23910B330AD80BDB76E7AC19092,取前兩個(gè)字節(jié)0x9B8D作為元數(shù)據(jù)表TypeDef中當(dāng)前定義類型ClassC名稱的壓縮結(jié)果。其中,本實(shí)施例在元數(shù)據(jù)中定位"ftStrings"流的位置的方法為在步驟S301中的獲得元數(shù)據(jù)頭的地址0x0000040c后,從元數(shù)據(jù)頭開始向后讀取,當(dāng)發(fā)現(xiàn)標(biāo)記"ftStrings"(0x23537472696E6773)后,讀取"#Strings"之前的8個(gè)字節(jié)數(shù)據(jù),得到數(shù)據(jù)0x0004000080040000,其中高位4個(gè)字節(jié)轉(zhuǎn)換成大端的表示方式為0x00000400,表示"ftStrings"流相對(duì)于元數(shù)據(jù)頭的偏移,低位4個(gè)字節(jié)轉(zhuǎn)換成大端的表示方式為0x00000480,表示"#Strings"流的長度,,低4個(gè)字節(jié);從元數(shù)據(jù)頭的地址0x0000040c,向后偏移0x00000400個(gè)字節(jié)得到"ftStrings"流的數(shù)據(jù)區(qū)域。步驟S304:獲取當(dāng)前定義類型中的方法重載信息,以及獲取當(dāng)前定義類型中所包含的方法的方法計(jì)數(shù)和字段計(jì)數(shù);本實(shí)施例中方法計(jì)數(shù)的獲取方法如下讀取元數(shù)據(jù)表TypeDef中當(dāng)前定義類型所在數(shù)據(jù)行的13、14字節(jié)中的數(shù)據(jù),該數(shù)據(jù)為定義類型所包含第一個(gè)方法在元數(shù)據(jù)表Method中的數(shù)據(jù)行號(hào),然后再讀取當(dāng)前定義類型的下一個(gè)定義類型所包含第一個(gè)方法在元數(shù)據(jù)表Method中的數(shù)據(jù)行號(hào),下一個(gè)定義類型所包含的第一個(gè)方法的數(shù)據(jù)行號(hào)減去當(dāng)前定義類型所包含的第一個(gè)方法的數(shù)據(jù)行號(hào),所得到的結(jié)果即為當(dāng)前類型中所包含的所有方法計(jì)數(shù)。元數(shù)據(jù)表TypeDef中最后一個(gè)數(shù)據(jù)行所包含的所有方法計(jì)數(shù)的獲取方法為元數(shù)據(jù)表Method中的數(shù)據(jù)行數(shù)減去最后一個(gè)定義類型數(shù)據(jù)行所包含的第一個(gè)方法的數(shù)據(jù)行號(hào),得到的結(jié)果即為元數(shù)據(jù)表TypeDef中最后一個(gè)數(shù)據(jù)行所包含的所有方法計(jì)數(shù)。本實(shí)施例中讀取到的元數(shù)據(jù)表TypeDef中定義類型ClassC所包含的第一個(gè)方法在元數(shù)據(jù)表Method中的數(shù)據(jù)行號(hào)為0x0008,定義類型ClassC的下一個(gè)數(shù)據(jù)行中定義類型StructB所包含的第一個(gè)方法在元數(shù)據(jù)表Method中的數(shù)據(jù)行號(hào)為0x000A,由0x000A-0x0008可知,定義類型ClassC中包含的方法數(shù)是0x0002個(gè)。定義類型的方法重載信息用于描述當(dāng)前類型中是否存在方法是虛方法、且需要開辟新的存儲(chǔ)槽,如果存在,則將該方法重載信息加1,其中,每個(gè)定義類型方法重載信息的初值為O。首先,定位元數(shù)據(jù)表Method(方法);具體的方法類似步驟S302中定位元數(shù)據(jù)表TypeDef的過程,簡單描述如下根據(jù)步驟S301中讀取出的現(xiàn)存表的位向量,從低位到高位依次記錄了.net文件中對(duì)應(yīng)的元數(shù)據(jù)表是否存在,其中,第7位代表元數(shù)據(jù)表Method是否存在,在本實(shí)施例中,第7位的數(shù)據(jù)為l,元數(shù)據(jù)表Method存在;在現(xiàn)存表位向量0x0000020920021f57之后的第9個(gè)字節(jié)開始,以四個(gè)字節(jié)為一個(gè)單位對(duì)應(yīng)的記錄了.net文件中存在的元數(shù)據(jù)表中所包含的數(shù)據(jù)行個(gè)數(shù),根據(jù)現(xiàn)存表位向量可知在元數(shù)據(jù)表Method之前還存在其它4個(gè)元數(shù)據(jù)表,跳過在Method前面的4個(gè)元數(shù)據(jù)表,在數(shù)據(jù)0x0000020920021f57后的第25個(gè)字節(jié)處開始讀取4個(gè)字節(jié),得到數(shù)據(jù)0x00000009,此數(shù)據(jù)表示元數(shù)據(jù)表Method中有9個(gè)數(shù)據(jù)行;讀取得到元數(shù)據(jù)表Method的內(nèi)容根據(jù)現(xiàn)存表的位向量以及其后表示元數(shù)據(jù)表行數(shù)的數(shù)據(jù)可知,在本實(shí)施例中元數(shù)據(jù)表Method之前存在元數(shù)據(jù)表Module有10個(gè)字節(jié)、元數(shù)據(jù)表TypeRef有186個(gè)字節(jié)、元數(shù)據(jù)表TypeDef有140個(gè)字節(jié)和元數(shù)據(jù)表Field有54個(gè)字節(jié),跳過前面的3個(gè)元數(shù)據(jù)表后,讀取元數(shù)據(jù)表Method的9個(gè)數(shù)據(jù)行、共126個(gè)字節(jié)。然后,根據(jù)當(dāng)前定義類型所包含第一個(gè)方法在元數(shù)據(jù)表Method中的數(shù)據(jù)行號(hào)從元數(shù)據(jù)表Method中讀取相應(yīng)數(shù)據(jù)行的數(shù)據(jù),元數(shù)據(jù)表Method中每一個(gè)數(shù)據(jù)行的第7、8個(gè)字節(jié)是方法標(biāo)識(shí),根據(jù)該方法標(biāo)識(shí)判斷當(dāng)前類型中的方法是否是虛方法、且需要開辟新的存儲(chǔ)槽,如果是,則方法重載信息加1;若當(dāng)前定義類型的方法計(jì)數(shù)大于l,則繼續(xù)在元數(shù)據(jù)表Method中讀取下一個(gè)數(shù)據(jù)行,根據(jù)上述方法執(zhí)行操作。直至將當(dāng)前定義類型所包含的方法全部讀取并判斷完畢;具體地,判斷當(dāng)前類型中的方法是否是虛方法、且需要開辟新的存儲(chǔ)槽的方法為讀取當(dāng)前類型中方法的標(biāo)識(shí),將該標(biāo)識(shí)與0x0100進(jìn)行與運(yùn)算,若運(yùn)算的結(jié)果為0x0100則可以判斷出當(dāng)前類型中的方法是虛方法、且需要開辟新的存儲(chǔ)槽。獲取當(dāng)前定義類型中所包含的字段計(jì)數(shù)與獲取當(dāng)前類型中所包含方法計(jì)數(shù)的方法類似,簡單描述如下讀取元數(shù)據(jù)表TypeDef中當(dāng)前定義類型所在行的第11、12字節(jié)存儲(chǔ)的數(shù)據(jù),得到當(dāng)前定義類型所包含的第一個(gè)字段在元數(shù)據(jù)表Field中的數(shù)據(jù)行號(hào),然后讀取下一數(shù)據(jù)行中的第11、12字節(jié)所存儲(chǔ)的當(dāng)前定義類型的下一個(gè)定義類型包含的第一個(gè)字段在元數(shù)據(jù)表Field中的數(shù)據(jù)行號(hào),后者的數(shù)據(jù)行號(hào)減去前者的數(shù)據(jù)行號(hào)所得到的結(jié)果即為當(dāng)前類型中所包含的字段計(jì)數(shù)。本實(shí)施例中讀取到的元數(shù)據(jù)表TypeDef中定義類型ClassC所包含的第一個(gè)字段在元數(shù)據(jù)表Field中的數(shù)據(jù)行號(hào)為0x0007,定義類型ClassC的下一個(gè)定義類型StructB所包含的第一個(gè)字段數(shù)據(jù)行號(hào)為0x0009,由0x0009-0x0007可知,當(dāng)前定義類型ClassC中所包含的字段個(gè)數(shù)是0x0002個(gè),即定義類型ClassC的字段計(jì)數(shù)為0x0002。步驟S305:獲取當(dāng)前定義類型中的字段對(duì)應(yīng)的信息并壓縮。根據(jù)現(xiàn)存表位向量在元數(shù)據(jù)表Field中讀取相應(yīng)的字段的數(shù)據(jù),并根據(jù)所獲取的當(dāng)前定義類型所包含字段計(jì)數(shù)和字段序號(hào),讀取元數(shù)據(jù)表Field的方法與步驟S302類似;元數(shù)據(jù)表Field中每個(gè)數(shù)據(jù)行的長度為6個(gè)字節(jié);其中第1、2個(gè)字節(jié)存儲(chǔ)的是元數(shù)據(jù)表Field中該數(shù)據(jù)行中字段的Flags(字段標(biāo)識(shí)),第3、4個(gè)字節(jié)存儲(chǔ)的是字段的name(字段名),第5、6個(gè)字節(jié)存儲(chǔ)的是字段的Signature信息。對(duì)當(dāng)前定義類型中的字段對(duì)應(yīng)的信息進(jìn)行壓縮的過程如下1)獲取字段名并對(duì)其進(jìn)行壓縮對(duì)讀取到的字段的name(字段名)進(jìn)行hash運(yùn)算,取hash值中第七約定個(gè)字節(jié)作為該字段name(字段名)的壓縮結(jié)果,在本實(shí)施例中第七約定個(gè)字節(jié)為hash值的前兩個(gè)字節(jié);在本實(shí)施例中ClassC中包含兩個(gè)字段,name(字段名)分別為strField和iField,以對(duì)字段strField的字段名"strField"進(jìn)行壓縮為例,壓縮后得到的hash值為0x846461722F82ElCAB3D95632E8424089,取hash值的前兩個(gè)字節(jié)0x8464作為該字段名"strField"的壓縮結(jié)果。2)對(duì)字段的標(biāo)識(shí)進(jìn)行壓縮根據(jù)在元數(shù)據(jù)表Field中讀取到的字段的Flags(字段標(biāo)識(shí)),根據(jù)該字段的Flags可以判斷出該字段的標(biāo)識(shí)信息,本實(shí)施例中將字段的標(biāo)識(shí)信息分為兩類訪問標(biāo)識(shí)和描述性標(biāo)識(shí);對(duì)該字段的訪問標(biāo)識(shí)和描述性標(biāo)識(shí)的值進(jìn)行或運(yùn)算,得到該字段Flags的壓縮結(jié)果;其中,訪問標(biāo)識(shí)包括私有范圍類型PrivateScope=0x00私有類型Private=0x01家族與程序集類型FamANDAssem=0x02程序集類型Assembly=0x03家族類型Family=0x04家族或程序集類型FamORAssem=0x05公共類型Public=0x06描述性標(biāo)識(shí)有靜態(tài)類型Static=0x10初始化InitOnly=0x20不可序列化NotSerialized=0x80在本實(shí)施例中,定義類型ClassC中包含兩個(gè)字段分別為strField和iField,對(duì)strField字段標(biāo)識(shí)進(jìn)行壓縮時(shí)分析其Flags(字段標(biāo)識(shí))可知,該字段的訪問標(biāo)識(shí)為Private=0x01,描述性標(biāo)識(shí)為Static=0xl0,0x01與0x10進(jìn)行或運(yùn)算得到Oxll,則strField字段的標(biāo)識(shí)壓縮結(jié)果為Oxll。3)獲取字段的類型字段的類型存儲(chǔ)在"ftBlob"流中,讀取元數(shù)據(jù)表Field中當(dāng)前行第4個(gè)字節(jié)的18Signature信息,該信息為該字段類型信息在"#Blob"流中的相對(duì)偏移地址,根據(jù)該相對(duì)偏移地址在"ftBlob"流中讀取相應(yīng)的數(shù)據(jù);其中,讀取到的第一字節(jié)的數(shù)據(jù)表示其后的數(shù)據(jù)長度,第2字節(jié)表示數(shù)據(jù)的類型,若第2字節(jié)為0x06,則表示該數(shù)據(jù)為字段的類型,第3字節(jié)數(shù)據(jù)表示字段類型、或者是在第4字節(jié)中包含字段類型信息;根據(jù)第3字節(jié)所示的字段類型查找元數(shù)據(jù)表中與之相對(duì)應(yīng)的類型、或者解析第4字節(jié)中包含字段類型信息得到該字段在元數(shù)據(jù)表中對(duì)應(yīng)的類型,并將元數(shù)據(jù)表中該類型壓縮后的偏移作為該字段的類型進(jìn)行保存。其中,定位"ftBlob"流位置的方法與步驟S302中在元數(shù)據(jù)中定位"#Strings"流的位置的方法類似在步驟S301中的獲得元數(shù)據(jù)頭的地址0x0000040c后,從元數(shù)據(jù)頭開始向后讀取,當(dāng)發(fā)現(xiàn)標(biāo)記"ftBlob"(0x23426C6F6)后,讀取"#Blob"之前的8個(gè)字節(jié)數(shù)據(jù),得到數(shù)據(jù)0xD4080000C8010000,其中高4個(gè)字節(jié)轉(zhuǎn)換成大端的表示方式為0x000008D4,表示"ftBlob"流相對(duì)于元數(shù)據(jù)頭的偏移,低4個(gè)字節(jié)轉(zhuǎn)換成大端的表示方式為0x0001C8,表示"SBlob"流的長度,;從元數(shù)據(jù)頭的地址0x0000040c,向后偏移0x000008D4得到"ftBlob"流的數(shù)據(jù)區(qū)域。在本實(shí)施例中,獲取定義類型ClassC中所包含的字段strField的字段類型的方法如下在元數(shù)據(jù)表Field中讀取strField的第4個(gè)字節(jié)的數(shù)據(jù)得到0x000A,然后在"ftBlob"流的數(shù)據(jù)區(qū)域中的偏移OxOOOA處讀取數(shù)據(jù),讀取到第1字節(jié)的數(shù)據(jù)0x02,表示在該數(shù)據(jù)后需要讀取2個(gè)字節(jié)長度的數(shù)據(jù),得到0x060E,其中第2個(gè)字節(jié)為0x06,表示的是該字節(jié)后的數(shù)據(jù)表示的是字段類型,繼續(xù)讀取第3個(gè)字節(jié)得到數(shù)據(jù)OxOE,根據(jù)語言規(guī)范可知OxOE表示該字段類型為string類型,查找元數(shù)據(jù)表TypeRef中string類型壓縮后的偏移,查找得到的結(jié)果為0x03,將0x03作字段strField的字段類型進(jìn)行保存。本實(shí)施例定義類型壓縮后的字段對(duì)應(yīng)的信息中包含3個(gè)部分2個(gè)字節(jié)長度的name(字段名)壓縮值、1個(gè)字節(jié)的Flags(字段標(biāo)識(shí))壓縮值和1個(gè)字節(jié)的Signature信息壓縮值;若當(dāng)前類型中包含有多個(gè)字段,則將每個(gè)字段壓縮后順序保存。根據(jù)上述所示的方法,ClassC中所包含的字段strField和iField的信息壓縮后的結(jié)果為0x84641103FlEC0106。若當(dāng)前定義類型中不存在定義字段,則壓縮后的定義類型中不存在此項(xiàng)。步驟S306:判斷當(dāng)前定義類型是否存在父類,若存在父類且其父類未壓縮,則執(zhí)行步驟303,通過遞歸的方法壓縮當(dāng)前類的父類;否則執(zhí)行步驟307;從元數(shù)據(jù)表TypeDef中當(dāng)前類型所在數(shù)據(jù)行的第9、10字節(jié)讀取數(shù)據(jù);若讀取到的數(shù)據(jù)為0x0000,則當(dāng)前類型沒有父類,執(zhí)行步驟S307;若從元數(shù)據(jù)表TypeDef中當(dāng)前類型所在數(shù)據(jù)行的第9、10字節(jié)讀取到的數(shù)據(jù)不是0x0000,則將讀取到的以小端存儲(chǔ)方式保存的數(shù)據(jù)轉(zhuǎn)換成大端存儲(chǔ)的格式,即轉(zhuǎn)換后是高字節(jié)在前、低字節(jié)在后的形式,然后將轉(zhuǎn)換后數(shù)據(jù)的二進(jìn)制數(shù)右移兩位,得到當(dāng)前類型的父類在元數(shù)據(jù)表TypeRef或TypeDef中的數(shù)據(jù)行號(hào);移位后得到的數(shù)據(jù)行號(hào)與0x03進(jìn)行與運(yùn)算,若運(yùn)算結(jié)果為0,則當(dāng)前類型的父類在元數(shù)據(jù)表TypeRef中,執(zhí)行步驟S307;若運(yùn)算結(jié)果為l,則可知當(dāng)前類型的父類在元數(shù)據(jù)表TypeDef中,查找元數(shù)據(jù)表TypeDef中與該數(shù)據(jù)行號(hào)相對(duì)應(yīng)數(shù)據(jù)行的類型,如果已經(jīng)壓縮,執(zhí)行步驟S307,否則,執(zhí)行步驟S303。步驟S307:獲取定義類型所繼承的父類的類型壓縮后的偏移量;從元數(shù)據(jù)表TypeDef中當(dāng)前類型所在數(shù)據(jù)行的第9、10字節(jié)讀取數(shù)據(jù),若讀取到的數(shù)據(jù)為0x0000,則當(dāng)前類型沒有父類,保存0xFF表示當(dāng)前類型沒有父類型;若從元數(shù)據(jù)表TypeDef中當(dāng)前類型所在數(shù)據(jù)行的第9、10字節(jié)讀取到的數(shù)據(jù)不是0x0000,則將讀取到的以小端存儲(chǔ)方式保存的數(shù)據(jù)轉(zhuǎn)換成大端存儲(chǔ)的格式,即轉(zhuǎn)換后是高字節(jié)在前、低字節(jié)在后的形式,然后將轉(zhuǎn)換后數(shù)據(jù)的二進(jìn)制數(shù)右移兩位,得到當(dāng)前類型的父類在元數(shù)據(jù)表TypeRef或TypeDef中的數(shù)據(jù)行號(hào);移位后得到的數(shù)據(jù)行號(hào)與0x03進(jìn)行與運(yùn)算,若運(yùn)算結(jié)果為O,則當(dāng)前類型的父類在元數(shù)據(jù)表TypeRef中,查找元數(shù)據(jù)表TypeRef中與該數(shù)據(jù)行號(hào)相對(duì)應(yīng)數(shù)據(jù)行的類型壓縮后的偏移,并將其作為當(dāng)前類型的父類的偏移存儲(chǔ)下來;若運(yùn)算結(jié)果為l,則可知當(dāng)前類型的父類在元數(shù)據(jù)表TypeDef中,查找元數(shù)據(jù)表TypeDef中與該數(shù)據(jù)行號(hào)相對(duì)應(yīng)數(shù)據(jù)行的類型壓縮后的偏移,并將其作為當(dāng)前類型的父類的偏移存儲(chǔ)下來。例如,在本實(shí)施例中ClassC的父類的獲取過程如下讀取元數(shù)據(jù)表TypeDef中ClassC所在數(shù)據(jù)行的第9、10字節(jié),得到數(shù)據(jù)轉(zhuǎn)換為大端存儲(chǔ)格式后為0x0014,轉(zhuǎn)換成二進(jìn)制為10100,對(duì)二進(jìn)制數(shù)10100右移2位得到101即0x05,由于0x05與0x03進(jìn)行與運(yùn)算后的結(jié)果為0x01,可知ClassC的父類在元數(shù)據(jù)表TypeDef中第0x05個(gè)數(shù)據(jù)行,然后查找元數(shù)據(jù)表TypeDef中第0x05個(gè)數(shù)據(jù)行的定義類型壓縮后的偏移,并將其作為ClassC父類的偏移存儲(chǔ)下來。步驟S308:為當(dāng)前定義類型分配偏移量;按照以上步驟所述的方法對(duì)每個(gè)定義類型進(jìn)行壓縮后,獲取.net文件中元數(shù)據(jù)表TypeRef(引用類型)的壓縮信息,繼續(xù)引用類型壓縮后的偏移量連續(xù)地為定義類型分配偏移量。例如若.net文件中引用類型壓縮后的最后一個(gè)類型的偏移量為OxlA,則壓縮后定義類型中第一個(gè)類型的偏移量為OxlB,壓縮后第二個(gè)定義類型的偏移為OxlC。步驟S309:判斷是否有等待父類偏移量的定義類型在緩存中,若有,則執(zhí)行步驟S307,否則執(zhí)行步驟S310;步驟S310:判斷是否所有定義類型的數(shù)據(jù)分析完畢,若是則執(zhí)行步驟S311,否則,執(zhí)行步驟S303,繼續(xù)壓縮元數(shù)據(jù)表TypeDef中其余的定義類型;步驟S311:獲取當(dāng)前定義類型所繼承的接口偏移量及繼承的接口數(shù);當(dāng)所有定義類型的數(shù)據(jù)都經(jīng)過上述處理之后,可以通過查詢元數(shù)據(jù)表Interfacelmpl中的數(shù)據(jù)得到每個(gè)定義類型所繼承的接口偏移量和所繼承的接口數(shù);根據(jù)現(xiàn)存表位向量定位元數(shù)據(jù)表Interfacelmpl(接口類),具體讀取元數(shù)據(jù)表的方法與步驟S302類似;讀取元數(shù)據(jù)表Interfacelmpl。在元數(shù)據(jù)表Interfacelmpl中,每行有4個(gè)字節(jié),第1、2字節(jié)Class表示繼承該接口的類型在元數(shù)據(jù)表TypeDef中所在的數(shù)據(jù)行,第3、4字節(jié)Interface中的值轉(zhuǎn)換成二進(jìn)制數(shù)右移2位后得到的值為該接口類在元數(shù)據(jù)表TypeDef中所在的數(shù)據(jù)行。根據(jù)元數(shù)據(jù)表Interfacelmpl中讀取的信息得到元數(shù)據(jù)表TypeDef中每個(gè)定義類型所繼承的接口類和所繼承的接口數(shù);其中,還獲取相應(yīng)接口類的壓縮后的偏移量。若當(dāng)前定義類型沒有繼承任何接口,則壓縮后的定義類型中接口數(shù)為0x00,接口對(duì)應(yīng)的信息不存在。步驟S312:獲取嵌套類型所在的類型壓縮后的偏移量;根據(jù)當(dāng)前定義類型的標(biāo)識(shí)信息判斷當(dāng)前類型是否是嵌套類型,若是嵌套類型,則獲取當(dāng)前嵌套類型所在的類型的偏移量;若判斷出當(dāng)前類型不是嵌套類型,則壓縮后的定義類型中不存在此項(xiàng)。根據(jù)在步驟S303中從元數(shù)據(jù)表TypeDef中讀取四個(gè)字節(jié)的定義類型標(biāo)識(shí)信息判斷當(dāng)前類型是否是嵌套類型,若是嵌套類型則還要讀取元數(shù)據(jù)表NestedClass(嵌套類型)中的信息;根據(jù)現(xiàn)存表位向量定位元數(shù)據(jù)表NestedClass,具體的方法類似步驟S302;讀取元數(shù)據(jù)表NestedClass。在元數(shù)據(jù)表NestedClass中每行有4個(gè)字節(jié),第1、2字節(jié)為NestedClass表示當(dāng)前嵌套類型在元數(shù)據(jù)表TypeDef中所在的數(shù)據(jù)行,第3、4字節(jié)為EnclosingClass表示當(dāng)前定義類型所在的類型在元數(shù)據(jù)表TypeDef中所在的數(shù)據(jù)行。查找與當(dāng)前類型所在類型在元數(shù)據(jù)表TypeDef中所在的數(shù)據(jù)行,獲取當(dāng)前類型所在類型壓縮后的偏移量,并將其作為當(dāng)前嵌套類型所在的類型;例如,判斷元數(shù)據(jù)表TypeDef中ClassC的標(biāo)識(shí)信息可知,ClassC為嵌套類型;在元數(shù)據(jù)表NestedClass中查找嵌套類型為ClassC的項(xiàng),判斷在元數(shù)據(jù)表NestedClass中第1、2字節(jié)NestedClass的值在元數(shù)據(jù)表TypeDef中對(duì)應(yīng)的項(xiàng)是否是ClassC所在的數(shù)據(jù)行,如果是ClassC,則再取元數(shù)據(jù)表NestedClass中ClassC對(duì)應(yīng)的EnclosingClass所示的ClassC所在類型在元數(shù)據(jù)表TypeDef中的數(shù)據(jù)行,由于該數(shù)據(jù)行中對(duì)應(yīng)的類型為ClassA,于是可知嵌套類型ClassC所在的類型是ClassA,另對(duì)ClassA壓縮后的偏移量為0x17,則獲取ClassA壓縮后的偏移量為0x17。步驟S313:組織并存儲(chǔ)壓縮后的定義類型數(shù)據(jù)。對(duì)每個(gè)定義類型壓縮后的數(shù)據(jù)進(jìn)行組織,其格式為定義類型名稱的hash值、類型標(biāo)識(shí)的壓縮結(jié)果、類型所繼承的接口計(jì)數(shù)、類型父類的偏移量、類型中所包含的字段計(jì)數(shù)、類型中方法重載信息、嵌套類型所在類型的偏移量、類型所在接口的偏移量、類型中字段對(duì)應(yīng)的信息;其中,類型所的接口的偏移、類型中字段對(duì)應(yīng)的信息可以有多條,當(dāng)有多條時(shí),依次排列當(dāng)前定義類型中的接口偏移量、字段信息;另外,嵌套類型所在類型的偏移量、類型所繼承的接口的偏移量、類型中字段對(duì)應(yīng)的信息這三者中可能部分存在或都不存在,若不存在則壓縮結(jié)果中不寫入這些信息。例如,本實(shí)施例提供的代碼中,定義類型ClassC壓縮后的結(jié)果為0x9B8D240216020200171819F1EC010684641103為了使上述壓縮結(jié)果看起來更清楚直觀,將上述數(shù)據(jù)以表1的形式存放,參見表l,定義類型ClassC壓縮后的結(jié)果的解析結(jié)構(gòu)為表1定義類型ClassC壓縮部分劃分定義類型ClassC壓縮后的值定義類型名稱9B8D定義類型標(biāo)識(shí)2421<table>tableseeoriginaldocumentpage22</column></row><table>將.net文件中每一個(gè)定義類型壓縮完成后,按照壓縮后分配的偏移量順序地存儲(chǔ)。本實(shí)施例中所要進(jìn)行壓縮處理的數(shù)據(jù)是在.net架構(gòu)下編寫的代碼編譯后變成的二進(jìn)制數(shù)據(jù),通過本實(shí)施例提供的方法,定義類型的壓縮率最大可以達(dá)到30%,進(jìn)而可以有效地降低.net文件占用的存儲(chǔ)空間,使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行,進(jìn)而增強(qiáng)了小容量存儲(chǔ)介質(zhì)(例如智能卡)的功能。以上實(shí)施例提供的壓縮方法或壓縮裝置有效地降低了.net文件占用的存儲(chǔ)空間,利于.net文件在各種設(shè)備上使用,同時(shí)還較大地節(jié)省了系統(tǒng)的資源,提高了資源利用率。顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而可以將它們存儲(chǔ)在存儲(chǔ)裝置中由計(jì)算裝置來執(zhí)行,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求一種.net文件中定義類型的壓縮方法,其特征在于,所述方法包括獲取.net文件中使用的定義類型包含的信息;根據(jù)所述定義類型包含的信息獲取所述定義類型的指定信息和計(jì)數(shù)信息;對(duì)所述指定信息進(jìn)行壓縮;將壓縮后的指定信息和所述計(jì)數(shù)信息作為所述定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述獲取.net文件中使用的定義類型包含的信息的步驟包括讀取所述.net文件中的定義類型所在的元數(shù)據(jù)表;從所述定義類型所在的元數(shù)據(jù)表中獲取所述.net文件中使用的定義類型包含的信息。3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述定義類型包含的信息包括所述定義類型的標(biāo)識(shí)、所述定義類型的名稱的偏移量、所述定義類型中的方法的偏移量;相應(yīng)地,所述指定信息包括所述定義類型的標(biāo)識(shí)和所述定義類型的名稱;所述計(jì)數(shù)信息包括所述定義類型的方法重載信息和所述定義類型中包含的方法計(jì)數(shù)。4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述定義類型的標(biāo)識(shí)分為類型標(biāo)識(shí)、訪問標(biāo)識(shí)和描述性標(biāo)識(shí);相應(yīng)地,所述對(duì)所述指定信息進(jìn)行壓縮的步驟包括對(duì)所述類型標(biāo)識(shí)、訪問標(biāo)識(shí)和描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,將得到的數(shù)據(jù)作為所述定義類型的標(biāo)識(shí)的壓縮結(jié)果;對(duì)所述定義類型的名稱進(jìn)行哈希運(yùn)算,從運(yùn)算結(jié)果中提取約定的字節(jié)作為所述定義類型的名稱的壓縮結(jié)果。5.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述定義類型包含的信息還包括所述定義類型中的字段的偏移量;相應(yīng)地,所述指定信息還包括所述定義類型中的字段對(duì)應(yīng)的信息;所述計(jì)數(shù)信息還包括所述定義類型的字段計(jì)數(shù)。6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述定義類型中的字段對(duì)應(yīng)的信息包括字段的名稱、字段的標(biāo)識(shí)和字段的類型;其中,所述字段的標(biāo)識(shí)分為訪問標(biāo)識(shí)和描述性標(biāo)識(shí);相應(yīng)地,所述對(duì)所述指定信息進(jìn)行壓縮的步驟包括對(duì)所述字段的名稱進(jìn)行哈希運(yùn)算,從運(yùn)算結(jié)果中提取約定的字節(jié)作為所述字段的名稱的壓縮結(jié)果;對(duì)所述字段的標(biāo)識(shí)中的訪問標(biāo)識(shí)和描述性標(biāo)識(shí)進(jìn)行或運(yùn)算,將得到的結(jié)果作為所述字段的標(biāo)識(shí)的壓縮結(jié)果;將所述字段的類型對(duì)應(yīng)的類型壓縮后的偏移量作為所述字段的類型的壓縮結(jié)果。7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述定義類型包含的信息包括所述定義類型所繼承的父類的偏移量;相應(yīng)地,所述方法還包括判斷所述定義類型所繼承的父類是否已壓縮,如果是,獲取所述父類的偏移量;否則,對(duì)所述父類進(jìn)行壓縮,并為壓縮后的所述父類分配偏移量;相應(yīng)地,所述定義類型的壓縮結(jié)果中還包括壓縮后的所述父類的偏移量。8.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括判斷所述定義類型是否有繼承的接口;如果有,獲取所述定義類型繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù);相應(yīng)地,所述定義類型的壓縮結(jié)果中還包括所述繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù)。9.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括判斷所述定義類型是否是嵌套類型,如果是,獲取所述定義類型所在的類型壓縮后的偏移量;相應(yīng)地,所述定義類型的壓縮結(jié)果中還包括所述嵌套類型所在的類型壓縮后的偏移10.—種.net文件中定義類型的壓縮裝置,其特征在于,所述裝置包括定義類型信息獲取模塊,用于獲取.net文件中使用的定義類型包含的信息;根據(jù)所述定義類型包含的信息獲取所述定義類型的指定信息和計(jì)數(shù)信息;壓縮模塊,用于對(duì)所述定義類型信息獲取模塊獲取的指定信息進(jìn)行壓縮;壓縮結(jié)果存儲(chǔ)模塊,用于將所述壓縮模塊壓縮后的指定信息和所述定義類型信息獲取模塊獲取的計(jì)數(shù)信息作為所述定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述定義類型信息獲取模塊中的定義類型包含的信息包括所述定義類型的標(biāo)識(shí)、所述定義類型的名稱的偏移量、所述定義類型中的方法的偏移量;相應(yīng)地,所述指定信息包括所述定義類型的標(biāo)識(shí)和所述定義類型的名稱;所述計(jì)數(shù)信息包括所述定義類型的方法重載信息和所述定義類型中包含的方法計(jì)數(shù)。12.根據(jù)權(quán)利要求IO所述的裝置,其特征在于,所述定義類型信息獲取模塊中的定義類型包含的信息包括所述定義類型所繼承的父類的偏移量;相應(yīng)地,所述裝置還包括第一判斷模塊,用于判斷所述定義類型信息獲取模塊中的定義類型所繼承的父類是否已壓縮;父類偏移量獲取模塊,用于當(dāng)所述第一判斷模塊判斷的結(jié)果是所述父類已壓縮,獲取所述父類的偏移量;所述父類沒有壓縮,對(duì)所述父類進(jìn)行壓縮,并為壓縮后的所述父類分配偏移量;相應(yīng)地,所述壓縮結(jié)果存儲(chǔ)模塊中存儲(chǔ)的定義類型的壓縮結(jié)果中還包括壓縮后的所述父類的偏移量。13.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述裝置還包括第二判斷模塊,用于判斷所述定義類型信息獲取模塊中的定義類型是否有繼承的接□;接口信息獲取模塊,用于當(dāng)所述第二判斷模塊判斷的結(jié)果是所述定義類型有繼承的接口,獲取所述定義類型繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù);相應(yīng)地,所述定義類型的壓縮結(jié)果中還包括所述定義類型繼承的接口壓縮后的偏移量和繼承的接口的個(gè)數(shù)。14.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述裝置還包括第三判斷模塊,用于判斷所述定義類型信息獲取模塊中的定義類型是否是嵌套類型;偏移量獲取模塊,用于當(dāng)所述第三判斷模塊判斷的結(jié)果是所述定義類型是嵌套類型時(shí),獲取所述定義類型所在的類型壓縮后的偏移量;相應(yīng)地,所述壓縮結(jié)果存儲(chǔ)模塊中存儲(chǔ)的定義類型的壓縮結(jié)果中還包括所述定義類型所在的類型壓縮后的偏移量。15.根據(jù)權(quán)利要求10-14任一所述的裝置,其特征在于,所述定義類型包含的信息還包括所述定義類型中的字段的偏移量;相應(yīng)地,所述指定信息還包括所述定義類型中的字段對(duì)應(yīng)的信息;所述計(jì)數(shù)信息還包括所述定義類型的字段計(jì)數(shù)。全文摘要本發(fā)明提供了一種.net文件中定義類型的壓縮方法和裝置,屬于計(jì)算機(jī)應(yīng)用領(lǐng)域。所述壓縮方法包括獲取.net文件中使用的定義類型包含的信息,根據(jù)所述定義類型包含的信息獲取所述定義類型的指定信息和計(jì)數(shù)信息,對(duì)所述指定信息進(jìn)行壓縮,將壓縮后的指定信息和所述計(jì)數(shù)信息作為所述定義類型的壓縮結(jié)果進(jìn)行存儲(chǔ)。所述裝置包括定義類型信息獲取模塊、壓縮模塊和壓縮結(jié)果存儲(chǔ)模塊。本發(fā)明采用對(duì).net文件中的定義類型進(jìn)行壓縮,有效地降低了.net文件占用的存儲(chǔ)容量,進(jìn)而使.net文件可以在小容量存儲(chǔ)介質(zhì)(例如智能卡)上存儲(chǔ)并運(yùn)行。文檔編號(hào)G06F9/44GK101794220SQ20091024416公開日2010年8月4日申請(qǐng)日期2009年12月30日優(yōu)先權(quán)日2009年12月30日發(fā)明者于華章,陸舟申請(qǐng)人:北京飛天誠信科技有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1