CN101770367B - .net文件压缩方法和装置 - Google Patents
.net文件压缩方法和装置 Download PDFInfo
- Publication number
- CN101770367B CN101770367B CN200910244160XA CN200910244160A CN101770367B CN 101770367 B CN101770367 B CN 101770367B CN 200910244160X A CN200910244160X A CN 200910244160XA CN 200910244160 A CN200910244160 A CN 200910244160A CN 101770367 B CN101770367 B CN 101770367B
- Authority
- CN
- China
- Prior art keywords
- item
- define
- value
- parameter
- stream
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种.NET文件压缩方法和装置,属于计算机应用领域。所述压缩方法包括:定位到.NET文件,根据所述.NET文件,定位到定义方法表及相关的流;根据所述定义方法表将所述流中每个定义方法的相应数据项的内容构造字符串;对所述字符串进行散列运算以转换成名称散列值;将所述定义方法的执行标识和访问标识进行压缩;将所述流中所述定义方法的参数表进行压缩;组织所述名称散列值、所述压缩的执行标识和访问标识、参数计数和所述压缩的参数表,得到压缩结构。通过对.NET文件中的定义方法部分压缩,有效地减小了.NET文件占用的存储容量,利于.NET文件在小存储量的设备上使用。
Description
技术领域
本发明涉及计算机领域,特别涉及一种.NET文件压缩方法和装置。
背景技术
.NET是基于互联网的跨语言软件开发平台,.NET并非开发语言,.NET代表一个集合,一个环境,一个可以作为平台支持下一代Internet的可编程结构。.NET最终目的是让用户在任何地方、任何时间,以及利用任何设备都能访问所需的信息、文件和程序。其支持的开发语言有C#、ASP.NET、VB.NET、DELPHI.NET等。
.NET卡是一种含有可以运行.NET程序的.NET虚拟机的微处理器智能卡。虚拟机相当于一台用软件来模拟的机器,在这台机器里有处理器、内存、寄存器等各种模拟的硬件,模拟运行各种指令,在这台机器上运行的软件对运行环境没有特殊要求,所以虚拟机对在它上运行的程序是透明的。例如,x86虚拟机模拟的是x86指令程序的运行环境,c51虚拟机模拟的是c51指令程序的运行环境。当在.NET卡中运行服务程序时,通常会调用标准类库中的类和函数。
下面,先简单说明一下PE文件结构,.NET文件在PE文件中的位置,.NET文件,及定义方法在.NET文件中的位置以及定义方法的结构。
PE(Portable Executable,可移植执行)格式,是Windows的可执行文件的格式,Windows中的exe文件,dll文件,都是PE格式。Portable(可移植)是指对于不同的Windows版本和不同的CPU类型,PE文件的格式是一样的,当然CPU不一样了,CPU指令的二进制编码是不一样的,但是文件中各种数据的结构是一样的。
PE文件结构的总体层次分布如下所示:
|DOS MZ Header|
|--------------|
|DOS Stub |
|------------------------|
|PE Header |
|------------------------|
|Section Table |
|--------------|
|Section 1|
|--------------|
|Section 2|
|--------------|
|Section... |
|--------------|
|Section n |
--------------
所有PE文件中,最开始必须是一个简单的DOS MZ header。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ Header之后的DOS Stub。DOS Stub是一个有效的EXE,在不支持PE文件格式的操作系统中,它将显示一个错误提示,例如“This program requires Windows”。通常情况下,DOS stub由汇编器、编译器自动生成。
紧接着DOS Stub的是PE Header,它是一个IMAGE_NT_HEADERS结构。其中包含了很多PE文件被载入内存时需要用到的重要域。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header中找到PE header的起始偏移量,因而DOS stub直接定位到真正的文件头PE header。
PE Header后面是数组结构Section Table(节表)。如果PE文件里有5个节,那么此Section Table数组结构内就有5个成员,每个成员包含对应节的属性、文件偏移量、虚拟偏移量等。
PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数据。节是以其起始位址来排列,而不是以其字母次序来排列。通过节表提供的信息,就可以找到这些节。
.NET文件存储在PE文件的某个节中,可以通过PE头文件中存储的.NET文件的位置和偏移量定位到.NET文件。.NET文件具体是以元数据的形式存在。元数据其实就是一个二进制的数据块,分为数据表和数据流,参见表1,是一个完整的元数据结构:
表1
上面以#开头的就是元数据中可能出现的6个命名流,这6个元数据流的具体用途分别为:
#Strings:用来存储元数据项的名字,如类名、方法名等;
#Blob:用来存储一些内部的对象实例,如默认值;
#US:用户定义的字符串常量;
#GUID:包含各种全局统一标志符;
#~:“优化的”、“压缩的”元数据,里面的元数据表以优化方式存储;
#-:非优化的元数据(和#~不能共存);
其中(#~或#-)、#GUID、#Strings是必不可少的。
元数据表中列有40多个类型的表,各种类型的表以固定的顺序存储,每张表中涉及的具体内容存储在上述各个数据流中。其中的定义方法表中存放有多个定义方法,定义方法表的每一行对应一个定义方法,每个定义方法中的内容都存放在上述提到的六个数据流中,定义方法与数据流的对应关系是固定的。
发明人发现目前使用的.NET文件的定义方法表数据量较大,导致编译后占用了大量的存储空间,造成了资源浪费。
发明内容
本发明旨在提供一种.NET文件压缩方法和装置,能够解决.NET文件占用存储容量较大等问题。在本发明中,提供了一种.NET文件压缩方法,包括以下步骤:
定位到.NET文件;
根据所述.NET文件,定位到所述.NET文件中的元数据表中的定义方法表及相关的流;
根据所述定义方法表将所述流中每个定义方法的相应数据项的内容构造字符串;所述数据项的内容包括参数计数;
对所述字符串进行散列运算以转换成名称散列值;
将所述定义方法的执行标识和访问标识进行压缩;
将所述流中所述定义方法的参数表进行压缩;
组织所述名称散列值、所述压缩的执行标识和访问标识、参数计数和所述压缩的参数表,得到压缩结构。
本发明实施例还提供了一种.NET文件压缩装置,所述装置包括:
定位模块,用于定位到.NET文件;根据所述.NET文件,定位到所述.NET文件中的元数据表中的定义方法表及相关的流;
字符串构造模块,用于根据所述定位模块定位的定义方法表将所述流中每个定义方法的相应数据项的内容构造字符串;所述数据项的内容包括参数计数;
压缩模块,用于对所述字符串构造模块构造的字符串进行散列运算以转换成名称散列值;以及将所述定义方法的执行标识和访问标识进行压缩,将所述流中所述定义方法的参数表进行压缩;
组织模块,用于组织所述压缩模块得到的名称散列值、所述压缩的执行标识和访问标识、参数计数和所述压缩的参数表,得到压缩结构。
通过对.NET文件中的定义方法部分压缩,有效地减小了.NET文件占用的存储容量,利于.NET文件在小存储量的设备上使用,也节省了资源,提高了资源的利用率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1示出了本发明实施例1提供的一种.NET文件压缩方法流程图;
图2示出了本发明实施例2提供的一种.NET文件压缩方法流程图;
图3示出了本发明实施例2提供的利用.NET文件中的定义方法信息构造字符串的方法流程图;
图4示出了本发明实施例2提供的为压缩大头方法特有的数据项的方法流程图;
图5示出了本发明实施例3提供的一种.NET文件压缩装置的结构框图。
具体实施方式
下面将参考附图并结合实施例,来详细说明本发明。
本发明实施例主要针对编译后的.NET文件中的定义方法部分进行压缩。通过对该部分压缩,有效地减小了.NET文件占用的存储容量,利于.NET文件在小存储量的设备上使用,同时节省了资源,提高了资源的利用率。
实施例1
参见图1,本实施例提供了一种.NET文件压缩方法,该方法包括:
步骤001:定位到.NET文件,根据该.NET文件定位到.NET文件中的元数据表中的定义方法表及相关的流;
步骤002:根据上述定义方法表将上述流中每个定义方法的相应数据项的内容构造字符串,所述数据项的内容包括参数计数;
步骤003:对构造得到的字符串进行散列运算以转换成名称散列值;
步骤004:将上述定义方法的执行标识和访问标识进行压缩;
步骤005:将上述流中定义方法的参数表进行压缩;
步骤006:组织上述名称散列值、压缩的执行标识和访问标识、参数计数和压缩的参数表,得到压缩结构。
其中,上述名称散列值、压缩的执行标识和访问表识、参数计数和压缩的参数表是按照预设规则进行组织的。
上述.NET文件带有一个.NET文件头,其中存储了上述元数据结构表的起始位置、内容描述及各项内容所占的字节大小,有了起始位置和各项内容所占的字节大小就可以计算出本实施例中要用到的元数据流、字符串流、blob流、GUID流和用户字符串流等的具体地址,根据计算出的地址可以定位对应的流。
本实施例通过对.NET文件中的定义方法部分压缩,有效地减小了.NET文件占用的存储容量,利于.NET文件在小存储量的设备上使用;同时节省了资源,提高了资源的利用率。
实施例2
本实施例提供了一种.NET文件压缩方法,参见图2,该方法具体包括下列步骤:
步骤101:根据PE文件结构及.NET文件,定位到元数据表中的定义方法表及相关的流,读取表头中的方法表的行数,该行数代表了方法的个数;设定方法计数值;
定位的过程包括:由PE文件的文件头中的内容定位到.NET文件,再由.NET文件头中的内容定位到.NET文件中的各个流(包括元数据流、字符串流、blob流、GUID流和用户字符串流)的地址和大小。.NET文件如上表所示:由存储签名、存储头、流头和六个数据流组成。其中,存储签名的大小是固定的,存储头的大小也是固定的,流头中存储有当前.NET文件中包含的各个流的名称、大小和偏移地址,有了这些数据,就可以定位到.NET文件的六个流,本实施例中需要用到的流有字符串流、blob流和元数据流。
定位到元数据流后,还要继续定位到其中的元数据表。如表1所示:元数据流由元数据头、表记录计数和元数据表构成。其中,元数据头的长度为固定值,其中带有一个8个字节的MaskValid字段,标识了现存所有表的位向量,位向量的每一位代表一个表,每一位位向量的取值有0和1两个选择,0代表该位向量指向的表不存在,反之1代表存在。目前,元数据模式下共定义了44个类型的表,上面提到的位向量分别指向每个类型的表,根据其中的值就可以确定这些表是否存在,比如位向量的第七位对应着定义方法表,该位向量的值为1,说明元数据表中确实存在定义方法表,因此元数据头标识出了元数据表中共有多少个表。
表记录计数为上述标识的每张表定义了4个字节的数据,这4个字节的数据表明了其中每张表的行数,每张表中的每一行的数据宽度是指定的。由于元数据头的长度是固定的,表记录计数的字节长度也是确定的(该长度等于元数据头中确定的表张数乘以4),因此能够从元数据流定位到元数据表。
从元数据表定位到定义方法表的过程如下:元数据表中依次存放了多个不同类型的表(具体有多少个表,可以根据在上面的元数据表头的MaskValid字段算出),每张表中列有很多行,行数已经由表记录计数规定好,且每一行所占的长度是事先规定好的,因此通过计算定义方法表前所有表所占的长度,就可以从元数据表定位到定义方法表。
元数据表中的每一行对应着一个方法,每个方法都具有一张数据项表,表中的部分项与预先定义的流相关联,如:名称项与字符串流相关联。表中每个方法占用的空间是确定的,由此可以定位到某个方法的数据项地址,从该数据项地址可以读取数据项的值。
设定方法计数值具体为设定参数i初始值为1,该值代表执行压缩的方法的个数。
步骤102:读取定义方法表中每个方法中的数据项;根据获取的数据项中的内容构造字符串;
方法表中每个方法都包括以下数据项:
(1)RVA(4字节无符号整数)为模块中方法体的相对虚拟地址(relative virtual address),RVA转向PE的只读段;
(2)ImplFlags(2字节无符号整数)实现的二进制标志,表示方法的实现方式;
(3)Flags(2字节无符号整数)表示方法可访问性和其他特征的二进制标志;
(4)Name(#Strings中的偏移量)方法的名称,与字符串流相关联。该记录项索引一个UTF-8编码格式长度大于0且小于1023个字节的字符串;
(5)Signature(#Blob流中的偏移量)方法特征,与blob流相关联。该记录项索引一个长度大于0的blob流;
(6)ParamList(参数表的RID)记录索引,指明属于方法的参数列表的开始位置。下一方法的参数列表的起点或Param表的结束点决定此参数列表的结束位置。
参见图3,为利用.NET文件的定义方法信息构造字符串的方法流程图,构造字符串的方法包括:
步骤1021:读取上述数据项中名称项的值,并根据该值读取对应于字符串流中的数据得到方法的名称;
名称项对应着上述数据项中“Name”项,其中的值指示出该项在“字符串流”中的偏移地址,根据该偏移地址从“字符串流”中读取方法名称,如:MySampleMethod。
步骤1022:读取签名项的值,并根据该值读取对应的Blob流中的数据,获取并分析定义方法的参数信息及返回值的类型,其中参数信息具体包括:参数的个数和每个参数的类型等等信息;
签名项对应着上述表中的Signature项,由上表可知,签名项中的值指示出该项在“Blob流”中的偏移地址,根据该偏移地址从“Blob流”中读取签名信息,即该方法用到的一系列参数信息(如:参数个数、每个参数的类型等等)和返回值信息(包括返回值类型)。其中,返回值类型指向该定义方法使用过程中要用到的其它类型表中的具体类型。
步骤1023:根据返回值类型,在元数据表定义类型表或者引用类型表中找到返回值类型所指向的类型信息,并通过该类型的数据项表中对应的名称项和命名空间项记录的偏移在字符串流中读取该类型名称和命名空间名称等类的信息;
步骤1024:应用上述获取的命名空间名称和类型的名称构造返回值全名称字符串,本实施例构造的返回值全名称字符串的优选格式为:命名空间名称·类型名称;根据获取的参数类型分别读取参数的类型名称及命名空间名称,根据得到的数据构造参数全名称字符串,本实施例构造的参数全名称字符串的优选格式:命名空间名称·类型名称;
步骤1025:判断步骤1022中获取的参数个数是否大于1,如果是,返回步骤1024,继续获取每个参数的信息;否则,执行步骤1026;
步骤1026:根据步骤1024中得到的返回值全名称字符串和参数全名称字符串、步骤1021中获取的方法名称和步骤1022中获取的每个参数的信息构造字符串;
构造的字符串的优选格式如下:
返回值全名称字符串方法的名称(参数全名称字符串,......)
注:省略号分别为参数的个数中的每个参数信息。
步骤103:对步骤102中构造得到的字符串进行散列运算,取运算结果的前两位将其转换成值类型存储,该数据即为方法的名称散列值;
通过对步骤102中获取的一系列数据项进行散列运算,并截取其中部分值的过程,实现了对定义方法的压缩;
步骤104:获取定义方法的执行标识和访问标识,并进行压缩;
压缩过程为将步骤102中获取的原定义方法中的执行标识(ImplFlags)和访问标识(Flags)中的数据项进行重组,舍弃其中的部分数据项,最终将4个字节的标识项合为2个字节的标识项,实现了对标识项的压缩。
步骤105:确定方法的类型,如果方法为大头(fat header)方法,将步骤104中组合的标识位中的方法类型相关项置1,表明该方法为大头方法,执行步骤106;如果方法为小头(tiny header)方法,执行步骤107;
确定方法类型的步骤具体为:分析步骤102中获取的方法数据项中的RVA值,通过RVA定位到方法头信息,分析方法头信息的第一个字节,该字节的低二位表示方法头类型,如果该低二位的值为2(0010),则表示方法为小头方法;如果该低两位的值为3(0011),表示方法为大头方法。
步骤106:获取大头方法特有的数据项,并对其中的内容进行压缩;
参见图4,为压缩大头方法特有的数据项的方法流程图,对特有数据项压缩的方法包括:
步骤1061:对步骤105中获取的大头方法类型信息进行分析,得到最大栈大小和大头方法标识,压缩描述最大栈大小的数据,该数据在原有结构中占2个字节(16位),取该16位字节的低8位,舍弃高8位。
步骤1062:分析步骤105中获取的大头方法标识,获取局部变量签名标识,以获取局部变量个数;
参见图5,为本实施例提供的大头方法标识的结构示意图,由图5可知,大头方法标识由12个字节组成,前两个字节为标识信息,对应着图中的Flags项;之后的两个字节为最大栈大小信息,对应着图中的MaxStack项;再后的4个字节为代码大小信息,对应着图中的Code Size项;最后4个字节为局部变量签名序列号,对应着图中的Local Variables Signature Token项。分析大头方法标识中的局部变量签名序列号中的数据,如果该数据为0,则表明局部变量个数为0;否则,根据该值定位到元数据表的StandAloneSig表(独立特征描述符表,该表具有作为方法局部变量的复合特征),从该表中的Value项的内容读取到数据项签名的偏移,并读取局部变量个数;
设定大头方法头经编译后得到的16进制代码如下:
1B 30 02 00 38 00 00 00 03 00 00 11 00 14 0A 00
72 21 00 00 70 0A 00 DE 12 0B 00 06 07 6F 14 00
00 0A 28 0D 00 00 0A 0A 00 DE 00 00 DE 0F 00 06
72 3F 00 00 70 28 0D 00 00 0A 0A 00 DC 00 06 0C
2B 00 08 2A
步骤1063:分析大头方法标识,得到异常结构计数和异常信息,对其中的异常信息进行压缩;
大头方法标识中的Flags项占用2个字节(对应上述代码中的301B),0x301B=(0011000000011011)2,如果其中的第四位为0,则表明该大头方法中没有异常信息,异常结构数为0,执行步骤107;否则,如果其中的第四位为1,则表明该方法在IL代码后有多个段,即异常结构处理表,执行下列步骤:
a)分析大头方法标识信息,获取异常结构处理表;
结构化异常处理表由很多个段构成,每个段中存有至少一个异常信息。
分析步骤105中获取的大头方法标识Flags项中的第一个字节的第四位,如果该位对应的标识为1,则说明此方法拥有多个段;分析Flags项中第5、6字节得到代码的大小;根据上述获取的方法头字节宽度和代码的大小就可以偏移定位到异常结构处理表;
方法头的字节宽度是事先规定好的,大头方法的方法头字节宽度为12字节,相应的,小头方法的方法头字节宽度也是固定的。
方法中存有至少一个段,如果存有多个段,则这多个段顺序存储在一片存储区中;每个段中存储有至少一个异常结构。
b)根据段存放的存储区的偏移地址定位到段中内容,分析其中所存数据的第一个字节,如果该字节的第7位为1,则表示该大头方法段的异常结构类型为FatFormat格式,执行步骤c;否则,表示该大头方法的异常结构类型为TinyFormat格式,执行步骤d;
具体为根据某个段在结构化异常处理表中的位置定位到该段中内容,并分析段中所存数据的第一个字节。
c)根据段存放的存储区的偏移地址定位到段中内容,分析其中所存数据的第2到5个字节,这3个字节表明一个段中所有异常结构所占的存储空间的大小;如果第2个字节中的第8位为1,则表示还有其它的段(section)跟在这个段的后面;如果还有其它段,重复执行下面操作,直到所有段都压缩完;否则,执行完下面操作后,组织异常结构信息的压缩结构,之后执行步骤1064。
对每个段进行压缩的过程如下:如果该段的异常结构为大头类型,则段中异常结构所占的存储空间大小为第一长度,本实施例优选为n*24+4,其中n为异常结构数;读取方法体段中的Flags(4个字节)、TryOffset(4个字节)、TryLength(4个字节)、HandlerOffset(4个字节)、HandlerLength(4个字节)、ClassToken(4个字节)项,舍弃其中的HandlerLength,将TryOffset(4个字节)、TryLength(4个字节)、HandlerOffset(4个字节)项的值都压缩成2字节,压缩方法为舍弃高位,保留低位;把ClassToken中的四个字节数据压缩成一个字节,压缩方法为舍弃高位,只保留低8位字节;通过上面步骤获取的ClassToken在定义类型和引用类型表中找到对应的参数类型信息。参见表2,为组织后的异常结构信息表:
表2
异常类型 | Try offset | Try length | Handler offset |
其中,表中各数据项的顺序是任意的,前后次序可以随意调整。
d)分析步骤b中获取的偏移地址中的数据,第2个字节表明了一个段中所有异常结构所占的存储空间的大小;如果该字节的第8位为1,则表示还有其它的段(section)跟在这个段的后面;如果还有其它段,重复执行下面操作,直到所有段都压缩完;否则,执行完下面操作后,直接执行步骤1064。
对每个段进行压缩的过程如下:根据段中异常结构的类型,判断出当前段中异常结构为TinyFormat(小头格式),则当前段中异常结构所占的存储空间大小为第二长度,本实施例优选为:n*12+4;依次读取方法的Flags(2字节)、TryOffset(2字节)、TryLength(2字节)、HandlerOffset(2字节)、HandlerLength(2字节)和ClassToken项;从上述获取的各项配置中删除HandlerLength项。通过上面步骤获取的ClassToken项在定义类型和引用类型表中找到对应的异常类型信息。
步骤1064:获取Finally计数值;
当通过表达式n*24+4(见上面步骤c计算出当前段中异常结构的个数后,无论是大头类型的异常结构还是小头类型的异常结构,后面都接着这样的结构:
02标识,具体内容参见下面:
22TryOffset自方法体开始的try块的偏移(以字节为单位)
41TryLength try块的长度(以字节为单位)
52HandlerOffset上述try块的Handler地址
71HandlerLength上述Handler代码的大小(以字节为单位)
84ClassToken异常处理的基本类型的元数据标识
85FilterOffset
从该结构中能够读取标识位,该标识位中,大头类型用4字节表示,小头类型用2字节表示,参见表3,有如下几个可能值:下表列出了每个异常处理项所用的标识值:
标识 | 值 | 描述 |
COR_ILEXCEPTION_CLAUSE_EXCEPTION | 0x0000 | 基本异常处理 |
COR_ILEXCEPTION_CLAUSE_FILTER | 0x0001 | 过滤异常处理 |
COR_ILEXCEPTION_CLAUSE_FINALLY | 0x0002 | 最终异常处理 |
COR_ILEXCEPTION_CLAUSE_FAULT | 0x0004 | 错误异常处理 |
如果当前的异常结构的标识位为过滤异常或者最终异常,则将Finally计数加1,直到分析完所有异常结构,从而获得Finally计数值。
步骤1065:获取垃圾回收控制属性,该步骤具体包括:
a)分析元数据表中的CustomAttribute元数据表,如果该表中有行中的数据项Parent与当前分析方法(包括方法头与方法的参数)相对应,那么分析Type项的值,得到类型信息,类型名称及其构造方法等,并根据Value项中指向Blob流的偏移值定位到blob流中位置,分析第一个字节数据得到长度,跳过两字节的Prolog得到自定义属性类型的构造函数的参数值;
b)如果步骤a中得到的信息存在自定义属性有类型为Transaction,那么将属性标识为0x40,即第第7位置为1;
c)如果步骤a中得到的类型存在自定义属性类型GCControl,并根据由步骤a中得到的定义类型的构造函数参数的值,即GCControlMode类型的值,并相应的设置垃圾回收控制标识的值对应关系为:
Force=1,
Skip=2,
OnLowMemory=3。
步骤1066:根据上述获取的值,按表4所示结构组织压缩后的大头方法头结构表:
表4
垃圾回收标识 | 栈大小 | Finally计数 | 异常结构计数 | 异常信息 |
其中,垃圾回收标识即垃圾回收控制标识,上述大头方法头结构表中的各项数据没有次序,前后顺序可以任意调整。
步骤107:对参数表进行压缩;
根据步骤102中获取的定义方法数据项ParamList(参数表)中的值定位到元数据表参数表对应的参数行中,并根据步骤102中获取的参数个数信息,读取相应的参数行信息,该信息包括以下几个数据项Flags(2字节),Sequence和Name项,对这些数据项进行压缩,具体为舍弃Sequence和Name项,将Flags项中的内容压缩成1个字节;从读取的参数行信息的Flags项的值分析出此参数的标识;将上述标识和步骤102中得到的参数类型在压缩文件中类型存储区中的偏移组合成参数信息,格式为:参数标识·参数类型的偏移。
步骤108:如果步骤102中获取的参数个数大于1,返回步骤107;否则,执行步骤109;
步骤109:按照预设规则组织步骤103、104、106和107中压缩的数据,得到定义方法的压缩结构,优选的,本实施例中的预设规则具体参见表5所示(参数计数即为参数个数):
表5
Hash | 执行标识 | 标识 | 参数计数 | 局部变量计数 | 大头 | 参数信息 |
其中,表5中各数据项的顺序是任意的,前后次序可以随意调整。
其中的大头数据块只有在标识中标识此方法为大头时才会有,大头方法头压缩结构如表4所示;
这里的异常信息是根据异常结构计数来确定的,依次将所有的异常结构排列出来,异常结构信息的压缩结构如表6所示:
表6
异常类型 | Try offset | Try Length | Handler offset |
当前定义方法压缩完成后,将方法计数值加1;
步骤110:如果方法计数值小于步骤101中获取的表头的行数,返回步骤102;否则,结束所有操作。
步骤101中获取的表头的行数代表着数据表中存储的定义方法个数,因此方法计数值小于表头的行数,表明还有定义方法没压缩。
本实施例通过对.NET文件中定义方法部分进行压缩,节省了.NET文件的存储空间,进而使.NET文件可以在小容量存储设备上运行;同时节省了资源,提高了资源的利用率。
实施例3
参见图5,本实施例提供了一种.NET文件压缩装置,该装置包括:
定位模块202,用于定位到.NET文件;根据.NET文件,定位到.NET文件中的元数据表中的定义方法表及相关的流;
其中,定位模块202具体定位定义方法表和相关的流的方法可以参见实施例2中的方法实现,这里不再详述;
字符串构造模块204,用于根据定位模块202定位的定义方法表将流中每个定义方法的相应数据项的内容构造字符串;
字符串构造模块204具体构造字符串的过程同实施例2中的构造过程相同,这里不再详述;
压缩模块206,用于对字符串构造模块204构造的字符串进行散列运算以转换成名称散列值;以及将定义方法的执行标识和访问标识进行压缩,将流中定义方法的参数表进行压缩;
压缩模块206进行压缩的过程与实施例2中对应的压缩过程相同,这里不再详述;
组织模块208,用于组织压缩模块206得到的名称散列值、压缩的执行标识和访问标识、参数计数和压缩的参数表,得到压缩结构。
本实施例通过对.NET文件中的定义方法部分压缩,有效地减小了.NET文件占用的存储容量,利于.NET文件在小存储量的设备上使用;同时节省了资源,提高了资源的利用率。
需要说明的是:在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本公开实施例中的各步操作是通过软件实现的,因此可以保存在各种存储介质中发行,语“存储介质”可以表示用于存储数据的一种或多种装置,包括只读存储器(ROM)、随机存取存储器(RAM)、磁RAM、磁心存储器、磁盘存储介质、光存储介质、闪存装置和/或用于存储信息的其他机器可读介质。术语“机器可读介质”包括但不限于便携式或固定存储装置、光存储装置、无线通道或能够存储、容纳、或承载指令和/或数据的各种其他介质。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (11)
1.一种.NET文件压缩方法,其特征在于,包括以下步骤:
定位到.NET文件;
根据所述.NET文件,定位到所述.NET文件中的元数据表中的定义方法表及相关的流;
根据所述定义方法表对所述流中每个定义方法的相应数据项的内容构造字符串,所述数据项的内容包括参数计数;
对所述字符串进行散列运算以转换成名称散列值;
将所述定义方法的执行标识和访问标识进行压缩;
将所述流中所述定义方法的参数表进行压缩;
组织所述名称散列值、所述压缩的执行标识和访问标识、参数计数和所述压缩的参数表,得到压缩结构,
其中,根据所述定义方法表对所述流中每个定义方法的相应数据项的内容构造字符串包括:
读取所述数据项中名称项的值,并根据该值读取所述流中的字符串流中的数据,得到所述定义方法的名称;
读取所述数据项中签名项的值,并根据该值读取所述流中的Blob流中的数据,根据该数据分析所述定义方法的参数信息及返回值的类型;
在所述元数据表的定义类型表或者引用类型表中找到所述返回值的类型所指向的类型信息,并通过该类型的数据项表中对应的名称项和命名空间项记录的偏移在所述流的字符串流中读取该类型的类型名称和命名空间名称的信息;
应用所述命名空间名称和类型名称构成返回值全名称字符串;
根据获取的参数信息中的参数类型分别读取参数的类型名称及命名空间名称,得到的数据构成参数全名称字符串;
将得到的返回值全名称字符串、得到的所述定义方法的名称和所述参数全名称字符串构成所述字符串。
2.根据权利要求1所述的方法,其特征在于,根据所述.NET文件,定位到所述.NET文件中的元数据表中的定义方法表及相关的流包括:
由所述.NET文件的文件头中的内容定位到所述.NET文件中的各个流的地址和大小;
根据元数据流的元数据头中的位向量和表记录计数中的内容定位到方法表数据块在元数据流中的偏移地址。
3.根据权利要求1所述的方法,其特征在于,对所述字符串进行散列运算以转换成名称散列值包括:
对所述字符串进行散列运算;
取运算结果的前两位,将其转换成值类型存储,存储数据作为所述定义方法的名称散列值。
4.根据权利要求1所述的方法,其特征在于,将所述定义方法的执行标识和访问标识进行压缩包括:
将所述执行标识和访问标识中的数据项进行重组,舍弃其中的部分数据项,最终将所述执行标识和访问标识从4个字节合为2个字节。
5.根据权利要求1所述的方法,其特征在于,对所述定义方法的参数表进行压缩包括:
根据所述数据项中参数表项中的值定位到所述元数据表的参数表对应的参数行中;
读取相应的参数行信息,该信息包括:2字节的Flags项,Sequence项和Name项;
对所述参数行信息进行压缩,具体为舍弃Sequence项和Name项,将Flags项中的内容压缩成1个字节;
从Flags项的值分析出所述参数行的标识;
将所述标识和所述数据项中的参数类型在压缩文件中类型存储区中的偏移组合成参数信息;
在所述压缩结构中加入参数信息。
6.根据权利要求1所述的方法,其特征在于,压缩所述.NET文件中的定义方法还包括:
确定所述定义方法是大头方法;
对所述大头方法的局部变量进行压缩;
在所述压缩结构中加入局部变量计数和所述压缩的局部变量。
7.根据权利要求6所述的方法,其特征在于,对所述大头方法的局部变量进行压缩包括:
对所述大头方法的类型信息进行分析,得到最大栈大小和大头方法标识;
压缩描述所述最大栈大小的数据,包括:取16位字节的该数据的低8位,舍弃高8位;
分析所述大头方法标识,获取局部变量签名标识,以获取局部变量个数;
分析所述大头方法标识,得到异常结构计数和异常信息,对其中的异常信息进行压缩。
8.根据权利要求7所述的方法,其特征在于,如果所述大头方法在IL代码后有结构化异常处理表,则对其中的异常信息进行压缩包括:
通过分析所述大头方法的方法标识信息,确定所述大头方法的方法头字节宽度和代码的大小;
根据所述方法头字节宽度和代码的大小定位到所述结构化异常处理表;
根据异常结构处理段存放的存储区的偏移地址定位到段中的内容;
对每个段进行压缩,过程如下:
如果当前段的异常结构为大头格式,则当前段中异常结构所占的存储空间大小为第一长度,读取方法体段中的数据项,舍弃其中的HandlerLength项,将TryOffset项、TryLength项、HandlerOffset项的值都压缩成2字节,压缩方法为舍弃高位,保留低位;把ClassToken中的四个字节数据压缩成一个字节,压缩方法为舍弃高位,只保留低8位;
如果当前段的异常结构为小头格式,则当前段中异常结构所占的存储空间大小为第二长度,读取方法体段中的数据项,舍弃其中的HandlerLength项;
通过上面步骤获取的ClassToken在所述元数据表中的定义类型和引用类型表中找到对应的异常类型信息。
9.根据权利要求7所述的方法,其特征在于,对所述大头方法的局部变量进行压缩之后还包括:获取大头方法的垃圾回收标识及Finally计数;并根据所述垃圾回收标识、所述最大栈大小、所述Finally计数、所述异常结构计数和所述压缩后的异常信息组织大头方法结构表;在所述压缩结构中加入所述组织后的大头方法结构表。
10.根据权利要求1所述的方法,其特征在于,所述组织所述名称散列值、所述压缩的执行标识和访问表识、参数计数和所述压缩的参数表为按照预设规则进行组织。
11.一种.NET文件压缩装置,其特征在于,所述装置包括:
定位模块,用于定位到.NET文件;根据所述.NET文件,定位到所述.NET文件中的元数据表中的定义方法表及相关的流;
字符串构造模块,用于根据所述定位模块定位的定义方法表将所述流中每个定义方法的相应数据项的内容构造字符串,所述数据项的内容包括参数计数;
压缩模块,用于对所述字符串构造模块构造的字符串进行散列运算以转换成名称散列值;以及将所述定义方法的执行标识和访问标识进行压缩,将所述流中所述定义方法的参数表进行压缩;
组织模块,用于组织所述压缩模块得到的名称散列值、所述压缩的执行标识和访问标识、参数计数和所述压缩的参数表,得到压缩结构,
其中,所述字符串构造模块包括:
第一读取模块,用于读取所述数据项中名称项的值,并根据该值读取所述流中的字符串流中的数据,得到所述定义方法的名称;
第二读取模块,用于读取所述数据项中签名项的值,并根据该值读取所述流中的Blob流中的数据,根据该数据分析所述定义方法的参数信息及返回值的类型;
第三读取模块,用于在所述元数据表的定义类型表或者引用类型表中找到所述返回值的类型所指向的类型信息,并通过该类型的数据项表中对应的名称项和命名空间项记录的偏移在所述流的字符串流中读取该类型的类型名称和命名空间名称的信息;
第一构成模块,用于应用所述命名空间名称和类型名称构成返回值全名称字符串;
第四读取模块,用于根据获取的参数信息中的参数类型分别读取参数的类型名称及命名空间名称,得到的数据构成参数全名称字符串;
第二构成模块,用于将得到的返回值全名称字符串、得到的所述定义方法的名称和所述参数全名称字符串构成所述字符串。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910244160XA CN101770367B (zh) | 2009-12-30 | 2009-12-30 | .net文件压缩方法和装置 |
PCT/CN2010/080459 WO2011079796A1 (zh) | 2009-12-30 | 2010-12-29 | .net文件压缩方法 |
US13/129,296 US8805801B2 (en) | 2009-12-30 | 2010-12-29 | Method for compressing a .net file |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910244160XA CN101770367B (zh) | 2009-12-30 | 2009-12-30 | .net文件压缩方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101770367A CN101770367A (zh) | 2010-07-07 |
CN101770367B true CN101770367B (zh) | 2012-10-31 |
Family
ID=42503246
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910244160XA Active CN101770367B (zh) | 2009-12-30 | 2009-12-30 | .net文件压缩方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101770367B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011079796A1 (zh) * | 2009-12-30 | 2011-07-07 | 北京飞天诚信科技有限公司 | .net文件压缩方法 |
CN103838742B (zh) * | 2012-11-21 | 2017-11-10 | 新奥特(北京)视频技术有限公司 | 一种多媒体文件的压缩参数处理方法和装置 |
CN103500118B (zh) * | 2013-10-24 | 2017-01-04 | 北京奇虎科技有限公司 | 一种级联样式表优化方法和装置 |
CN104850561A (zh) * | 2014-02-18 | 2015-08-19 | 北京京东尚科信息技术有限公司 | 一种Android APK文件自适应压缩方法 |
CN106934066A (zh) * | 2017-03-31 | 2017-07-07 | 联想(北京)有限公司 | 一种元数据处理方法、装置和存储设备 |
CN108388648A (zh) * | 2018-02-28 | 2018-08-10 | 郑州云海信息技术有限公司 | 配置文件存取方法、系统、设备及计算机可读存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1539202A (zh) * | 2000-11-29 | 2004-10-20 | E������¼����������ι�˾ | 使用多通道编码信息并在单通道中解码的方法和设备 |
EP1445869A4 (en) * | 2002-03-27 | 2007-03-14 | Matsushita Electric Ind Co Ltd | VARIABLE LENGTH CODING METHOD, VARIABLE LENGTH DECODER PROCESSING, STORAGE MEDIUM, VARIABLE LENGTHING DEVICE, DEVICE FOR DECODING OF VARIABLE LENGTH AND BITSTROM |
-
2009
- 2009-12-30 CN CN200910244160XA patent/CN101770367B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1539202A (zh) * | 2000-11-29 | 2004-10-20 | E������¼����������ι�˾ | 使用多通道编码信息并在单通道中解码的方法和设备 |
EP1445869A4 (en) * | 2002-03-27 | 2007-03-14 | Matsushita Electric Ind Co Ltd | VARIABLE LENGTH CODING METHOD, VARIABLE LENGTH DECODER PROCESSING, STORAGE MEDIUM, VARIABLE LENGTHING DEVICE, DEVICE FOR DECODING OF VARIABLE LENGTH AND BITSTROM |
Also Published As
Publication number | Publication date |
---|---|
CN101770367A (zh) | 2010-07-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101770367B (zh) | .net文件压缩方法和装置 | |
CN101739453B (zh) | 一种对数据库表进行条件查询的方法及装置 | |
US9400733B2 (en) | Pattern matching framework for log analysis | |
US20050204340A1 (en) | Attribute-based automated business rule identifier and methods of implementing same | |
CN103345469B (zh) | 号码集合的存储、查询方法及其装置 | |
CN101727502A (zh) | 一种数据查询方法及装置、系统 | |
CN101799753B (zh) | 一种实现树形结构的方法及装置 | |
CN108536692A (zh) | 一种执行计划的生成方法、装置及数据库服务器 | |
CN103077192A (zh) | 一种数据处理方法及其系统 | |
Pierra et al. | From digital libraries to electronic catalogues for engineering and manufacturing | |
JP5548331B2 (ja) | ナビゲーションデータベースのためのフォーマット記述 | |
CN112148343A (zh) | 规则发布方法、装置及终端设备 | |
CN100357952C (zh) | 一种二进制数据的访问方法 | |
US20110264669A1 (en) | method for compressing a .net file | |
CN101963993A (zh) | 一种数据库单表记录快速查找的方法 | |
CN111898351B (zh) | 基于Aviator的Excel数据自动导入方法、装置、终端设备及存储介质 | |
CN105824647A (zh) | 一种表单页面生成方法和装置 | |
Cimini et al. | Nominal SOS | |
CN104750743A (zh) | 一种交易文件勾对系统和方法 | |
CN116049153B (zh) | 数据库的数据处理方法、装置、电子设备及存储介质 | |
CN115905630A (zh) | 一种图数据库查询方法、装置、设备及存储介质 | |
CN101794220B (zh) | .net文件中定义类型的压缩方法和装置 | |
CA2731799C (en) | Process for representing and handling multigraphs based on the use of bitmaps | |
Malik et al. | SOLE: towards descriptive and interactive publications | |
CN115840775A (zh) | 数据的提取方法、装置、服务器及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |