CN101770368B - .net文件中命名空间的压缩方法和装置 - Google Patents
.net文件中命名空间的压缩方法和装置 Download PDFInfo
- Publication number
- CN101770368B CN101770368B CN200910244164A CN200910244164A CN101770368B CN 101770368 B CN101770368 B CN 101770368B CN 200910244164 A CN200910244164 A CN 200910244164A CN 200910244164 A CN200910244164 A CN 200910244164A CN 101770368 B CN101770368 B CN 101770368B
- Authority
- CN
- China
- Prior art keywords
- name
- namespace
- name space
- space
- type
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 42
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 16
- 230000006835 compression Effects 0.000 claims description 37
- 238000007906 compression Methods 0.000 claims description 19
- 230000006870 function Effects 0.000 description 8
- 230000008569 process Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 4
- 230000001965 increasing effect Effects 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 3
- 230000003068 static effect Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 2
- 230000002708 enhancing effect Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- XUIMIQQOPSSXEZ-UHFFFAOYSA-N Silicon Chemical compound [Si] XUIMIQQOPSSXEZ-UHFFFAOYSA-N 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000004883 computer application Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000007430 reference method Methods 0.000 description 1
- 229910052710 silicon Inorganic materials 0.000 description 1
- 239000010703 silicon Substances 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种.net文件中命名空间的压缩方法和装置,本发明的.net文件中命名空间的压缩方法包括:获取.net文件中当前类型所属的命名空间名称;按照预先确定的算法对所述命名空间名称进行压缩;确定所述命名空间名称对应的类型计数;按照预先确定的格式对压缩后的所述命名空间名称和所述类型计数进行组合,得到所述命名空间名称对应的命名空间的压缩结果。所述装置包括:命名空间名称获取模块、压缩模块、类型计数确定模块和组合模块。通过对命名空间名称进行压缩,可以有效地降低.net文件占用的存储空间,使.net文件可以在小容量存储介质(例如:智能卡)上存储并运行。
Description
技术领域
本发明涉及计算机应用领域,具体而言,涉及一种.net文件中命名空间的压缩方法和装置。
背景技术
.Net是微软的新一代技术平台,是全新的基于互联网的跨语言软件开发平台,顺应了当今软件工业分布式计算、面向组件、企业级应用、软件服务化和以Web为中心等大趋势。.Net并非开发语言,但是在.Net开发平台上可以支持多种开发语言,如C#语言、C++、Visual Basic、Jscript等。
智能卡是一种大小和普通名片相仿的塑料卡片,内含一块直径1cm左右的硅芯片,具有存储信息和进行复杂运算的功能。它被广泛地应用于电话卡、金融卡、身份识别卡以及移动电话、付费电视等领域。其中,智能卡的芯片上,集成了微处理器、存储器以及输入/输出单元等,使得智能卡被认为是世界上最小的电子计算机。并且在智能卡上,拥有一整套性能较强的安全保密控制机制,安全控制程序被固化在只读存储器中,因而具有无法复制密码等可靠的安全保证。它较之普通磁卡,还具有信息存储容量大,可利用微处理器来增加卡片功能等优点。
.Net卡是一种含有可以运行.Net程序的.Net卡虚拟机的微处理器智能卡。所谓虚拟机,是指可以把它想象成一台用软件来模拟的机器,在这台机器里有处理器、内存、寄存器等各种硬件,模拟运行各种指令,在这台机器上运行的软件对运行环境没有特殊要求,所以虚拟机对在它上运行的程序来说是透明的。例如,x86虚拟机模拟的是x86指令程序的运行环境,c51虚拟机模拟的是c51指令程序的运行环境。
.net程序包括命名空间、引用类型、定义类型、定义方法、引用方法、IL(Intermediate Language,中间语言)代码等,其中命名空间是一种代码组织的形式,在.net程序中通过名称空间来管理不同的模块,区别不同的代码功能。
但是目前的智能卡由于体积和存储芯片的限制,其存储空间仍然有限,随着软件的发展,部分功能大的程序占用存储空间较大,对于很多的.net程序并不能进行存储和运行。
综上所述,相关技术中的.net程序不能很好地在小容量的存储介质(例如:智能卡)上存储和运行,且针对该问题目前尚未提出有效的解决方案。
发明内容
针对.net程序不能很好地在小容量的存储介质(例如:智能卡)上存储和运行而提出本发明,为此,本发明的主要目的在于提供一种.net文件中命名空间的压缩方法和装置,以解决上述问题至少之一。
为了实现上述目的,根据本发明的一个方面,提供了一种.net文件中命名空间的压缩方法。
根据本发明的.net文件中命名空间的压缩方法包括:
获取.net文件中当前类型所属的命名空间名称;
按照预先确定的算法对所述命名空间名称进行压缩;
确定所述命名空间名称对应的类型计数,所述类型计数是指在该命名空间中包括的类型的个数;
按照预先确定的格式对压缩后的所述命名空间名称和所述类型计数进行组合,得到所述命名空间名称对应的命名空间的压缩结果。
为了实现上述目的,根据本发明的另一方面,提供了一种.net文件中命名空间的压缩装置,所述装置包括:
命名空间名称获取模块,用于获取.net文件中当前类型所属的命名空间的命名空间名称;
压缩模块,用于按照预先确定的算法对所述命名空间名称获取模块获取的命名空间名称进行压缩;
类型计数确定模块,用于确定所述命名空间名称获取模块获取的命名空间名称对应的类型计数,所述类型计数是指在该命名空间中包括的类型的个数;
组合模块,用于按照预先确定的格式对所述压缩模块压缩后的所述命名空间名称和所述类型计数确定模块确定的类型计数进行组合,得到所述命名空间名称对应的命名空间的压缩结果。
本发明采用对获取到的命名空间名称进行压缩,并将压缩后的命名空间名称与对应的类型计数组合,得到压缩后的命名空间,可以有效地降低.net文件占用的存储空间,使.net文件可以在小容量存储介质(例如:智能卡)上存储并运行,进而增强了小容量存储介质(例如:智能卡)的功能。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是本发明实施例1提供的.net文件中命名空间的压缩方法的流程图;
图2是本发明实施例2提供的.net文件中命名空间的压缩方法的流程图;
图3是本发明实施例2提供的.net文件的结构的示意图;
图4是本发明实施例3提供的.net文件中命名空间的压缩装置的结构框图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
下面结合附图对技术方案的实施作进一步的详细描述:
实施例1
本实施例提供了一种.net文件中命名空间的压缩方法,如图1所示,该方法包括:
步骤S102,获取.net文件中当前类型所属的命名空间名称;
优选的,本实施例中命名空间名称的获取方法可以具体为:获取.net文件中包含命名空间名称偏移的元数据表;从上述元数据表中获取上述当前类型所属的命名空间名称偏移,根据所述命名空间名称的偏移在“#Strings”流中读取命名空间名称。
其中,在.net文件中包含有多个表,其中包含命名空间名称偏移的元数据表有定义类型或接口表TypeDef,引用类型表TypeRef。
步骤S104,按照预先确定的算法对上述命名空间名称进行压缩;
本实施例采用下述方法进行命名空间名称的压缩:
将上述命名空间名称组成命名空间字符串;对该命名空间字符串进行散列运算得到散列值;取该散列值中预定的字节作为压缩后的命名空间名称。其中,散列运算采用的算法可以是:MD5、SHA-1或SHA-2等。
将上述命名空间名称组成命名空间字符串包括:使用连接符将.net文件的公钥标记与命名空间名称连接得到命名空间字符串。
步骤S106,确定上述命名空间名称对应的类型计数,其中,类型计数是指在该命名空间中包括的类型的个数;
优选的,类型计数可以通过下述方法确定:
当上述命名空间名称是第一次获取时(即:之前没有获取过此命名空间名称),将上述命名空间名称对应的类型计数置1,以后每获取一次上述命名空间名称,就将该类型计数加1,直至遍历完上述元数据表。
步骤S108,按照预先确定的格式对压缩后的上述命名空间名称和上述类型计数进行组合,得到上述命名空间名称对应的命名空间的压缩结果。
其中,预先确定的格式可以为固定长度的字节,在此固定长度的字节中包含两部分,一部分字节为上述类型计数,另一部分剩余字节为上述压缩后的命名空间名称。
优选的,上述获取.net文件中当前类型所属的命名空间名称的步骤(步骤S102)之后还包括:
判断当前获取的上述命名空间名称是否已被获取过,如果没有,执行上述步骤S104,如果上述命名空间名称已被获取过,将该命名空间的类型计数加1。
优选的,本实施例提供的.net文件中命名空间的压缩方法还可以包括:
判断是否所有类型所属的命名空间名称都已经读取到;
如果是,执行上述按照预先确定的格式对压缩后的上述命名空间名称和上述类型计数进行组合的步骤(即,步骤S108);
否则,读取下一个类型所属的命名空间名称(即返回步骤S102)。
本实施例采用对获取到的命名空间名称进行压缩,并将压缩后的命名空间名称与对应的类型计数组合,得到压缩后的命名空间,可以有效地降低.net文件占用的存储空间,使.net文件可以在小容量存储介质(例如:智能卡)上存储并运行,进而增强了小容量存储介质(例如:智能卡)的功能。
实施例2
本实施例提供了一种.net文件中命名空间的压缩方法,该方法中将经过.net平台编译后的未进行命名空间压缩的文件称为.net文件,并通过压缩程序完成命名空间的压缩过程。如图2所示,该方法包括:
步骤S202,获取.net文件中包含命名空间名称偏移的元数据表;
在.net文件中包含有多个元数据表,其中包含命名空间名称偏移的元数据表有TypeDef(定义类型、接口表)、TypeRef(引用类型表),下面以在.net文件中获取元数据表TypeDef为例说明元数据表的获取过程;
本实施例以将下面的代码编译后的文件为例进行说明获取其元数据表的方法:
namespace MyCompany.MyOnCardApp
{
public class MyService:MarshalByRefObject
{
static Version ver=new Version(1,1,1,1);
static Int32 callCount=0;
static ClassB classb=new ClassB();
String strResult=Boolean.FalseString;
public String MySampleMethod()
{
String strHello=″Hello World!″;
return strHello+callCount.ToString();
}
}
public class ClassB{}
public struct StructB{}
}
对上述代码使用.net平台编译后得到helloworld.exe文件,并以二进制的形式存储在硬盘上,该二进制文件为.net文件,.net文件结构如图3所示,包括:Dos头(Dos Header)、PE特征等。
其中,压缩程序获取元数据表的过程如下:
a.压缩程序定位.net文件的Dos头,得到Dos头0x5a4d;
b.压缩程序从Dos头后跳过第一约定个字节,读出PE特征的偏移地址,得到PE特征的偏移地址0x00000080;在本实施例中,第一约定个字节为0x003a个字节;
c.压缩程序根据PE特征的偏移地址0x00000080定位PE特征,定位得到PE特征0x4550;
d.从PE特征开始,偏移第二约定个字节后读取四个字节,在本实施例中,以32位机为例进行说明,第二约定个字节为从PE特征向后偏移0x0074字节后,读出4个字节的数据为0x00000010,此值说明该二进制文件中存在0x10个目录,且包含.net数据;
其中,.net文件的元数据头地址写在上述第0x0F个目录中,在64位机中第二约定个字节为0x0084个字节;
e.从上述数据0x00000010向后偏移第三约定个字节后读取八个字节数据,在本实施例中,优选地,第三预定个字节为112个字节,在此八个字节数据中,前四个字节为0x00002008,为.net数据头的相对虚拟地址,后四个字节为0x00000048,为.net数据头的长度;
f.压缩程序根据.net数据头的相对虚拟地址得到线性地址0x00000208,并读取.net数据头得到如下数据:
48000000020005008C210000A0090000
090000000500000600000000000000005
020000080000000000000000000000000
000000000000000000000000000000000
0000000000000
需要说明的是,上述数据采用小端的存储方式,例如,上述数据前4个字节0x48000000为该数据的长度,转换成大端的存储方式为0x0000048;
在本实施例中,线性地址为.net数据在.net文件中的地址,相对虚拟地址为相对于PE载入点的内存偏移,线性地址和相对虚拟地址的转换关系为:线性地址=相对虚拟地址-节的相对虚拟地址+节的文件偏移,在本实施例中,读取.net文件中.net数据目录的节的相对虚拟地址为0x00002000,节的文件偏移为0x00000200,则线性地址=0x00002008-0x00002000+0x00000200=0x00000208;
g.压缩程序由.net数据头开始向后偏移第四约定个字节后读出8个字节数据,在本实施例中第四约定个字节为从.net数据头向后偏移8个字节后,读取共8个字节数据,在这8个字节中,前四个字节为0x0000218c,为元数据头(MetaData Header)的相对虚拟地址,后四个字节为0x000009a0,为元数据的长度;
h.根据元数据头的相对虚拟地址0x0000218c得到线性地址0x0000038c,根据线性地址和元数据长度得到元数据内容;
i.压缩程序由元数据头向后读取,当读取到标志“#~”时,读取标志“#~”前的八个字节,其中前四个字节为“#~”的地址,通过该地址得到“#~”流,在“#~”流中第五约定个字节开始读取长度为8个字节的数据,即0x0000000920021c57,其二进制形式为100100100000000000100001110001010111;
在本实施例中,第五约定个字节为“#~”流中起始位开始算起第9个字节;;
j.将步骤i中得到的二进制数据从低位开始读取,例如,第1位代表元数据表Module是否存在,如果是1,则证明存在元数据表Module,如果是0,证明不存在,在本实施例中,存在元数据表Module,并且第2位为1,表示元数据表TypeRef存在,第3位为1,表示元数据表TypeDef存在;
其中,在步骤i中所得到的数据中,从低位开始,每一位代表.net文件中是否存在对应的表;
k.压缩程序在数据0x0000000920021c57后偏移第六约定个字节后读取元数据表TypeDef的数据行数,在本实施例中为向后偏移16个字节后读取4个字节,得到数据0x00000006,判断得出元数据表TypeDef中存在6个数据行;
其中,在元数据中,数据0x0000000920021c57向后偏移8个字节后的数据中,以每4个字节为一个单位依次存储了在.net文件中存在的元数据表的数据行数,在表示数据行数的数据后,依次存储了每个元数据表的具体内容,为元数据表区域;
l.压缩程序根据约定的规则读取得到元数据表TypeDef的内容。
其中,在本实施例中约定的规则如下,压缩程序对数据0x0000000920021c57后记录元数据表个数的数据依次进行读取,即为0x00000001和0x0000001d,相加后可以得出元数据表TypeDef前的两个元数据表Module和TypeRef中共存在31个数据行,元数据表Module的数据行每行数据为10个字节,元数据表TypeRef中的数据行为每行6个字节,因此在元数据表区域中,向后偏移10*1+6*30=190个字节后,第191个字节开始为元数据表TypeDef的内容,元数据表TypeDef中的数据行每行为14个字节,因此元数据表TypeDef的长度为14*6=84个字节,得到元数据表TypeDef的数据如下:
0000000001000000000001000100
0100100019002300050001000100
0100100039002300090006000400
01011000400023000D0006000500
01011000400023000D0006000500
0000000071020000090007000700
上述数据中规定的字节标识不同信息,其中,每一行为元数据表TypeDef中的一个数据行,记录了一个类型的名称和属性,对于每一行,从高位开始读取,前4个字节为Flags(定义类型标识),5、6字节为定义类型名称相对于“#Strings”流的偏移量,7、8字节为该定义类型所属的命名空间名称相对于“#Strings”流的偏移量,具体参见表1:
表1
Flags | Name | Namespace | Extends | FieldList | MethodList |
00000000 | 0001 | 0000 | 0000 | 0001 | 0001 |
00100001 | 0019 | 0023 | 0005 | 0001 | 0001 |
00100001 | 0039 | 0023 | 0009 | 0006 | 0004 |
00100101 | 0040 | 0023 | 000D | 0006 | 0005 |
00100001 | 0048 | 0023 | 0009 | 0006 | 0005 |
00000000 | 0271 | 0000 | 0009 | 0007 | 0007 |
在本实施例中,元数据表TypeDef、TypeRef为类型表,上述类型表中包含有命名空间(namespace)信息,压缩程序需从元数据表TypeDef、TypeRef中获取命名空间信息。
在本实施例中,命名空间的类型计数是指该命名空间中存在的类型个数,在压缩程序开始执行压缩操作前,设置所有命名空间的类型计数为0。在一个.net文件中,每个命名空间的类型计数是独立的,即每个命名空间对应一个类型计数。
步骤S204,压缩程序读取元数据表中的类型的命名空间名称;
本实施例以读取元数据表TypeDef为例进行说明,例如,压缩程序读取上述元数据表TypeDef中第二个类型,按照上述元数据表的结构,读出其所属的命名空间的偏移量,即0x0023,其中,该命名空间的偏移量为相对于元数据中“#Strings”流的偏移量,压缩程序根据偏移量得到命名空间名称的过程如下:
压缩程序在元数据中定位“#Strings”流的位置,并通过命名空间偏移量0x0023读取命名空间信息,读取过程中,由偏移地址0x0023读起,遇到第一个0x00结束,得到命名空间名称为:
4D79436F6D70616E792E4D794F6E4361726441707000
上述命名空间对应的ASC II码为MyCompany.MyOnCardApp
其中,压缩程序每次只读出一个类型的命名空间名称;
压缩程序在元数据中定位“#Strings”流的位置的方法为:在步骤S202中的步骤h中获得元数据头的地址0x0000038c后,从元数据头开始向后读取,当发现标记““#Strings””后,读取““#Strings””的前8个字节,得到数据0x5C0300003C040000,其中高4个字节为“#Strings”流相对于元数据头的偏移,低4个字节为“#Strings”流的长度,高4个字节转换成大端的表示方式为0x0000035c,低4个字节转换成大端的表示方式为0x0000043c;压缩程序根据元数据头的地址0x0000038c,向后偏移0x0000035c得到“#Strings”流的数据区域;
步骤S206,判断所读出的命名空间名称是否与已经读出过的类型所属的命名空间重复,如果是,执行步骤S208,如果不是,执行步骤S210;
由于步骤S204中压缩程序读出的为元数据表中第二个类型所属的命名空间名称,在本实施例中,元数据表TypeDef中第一个类型不存在命名空间名称,因此不存在与已经读出的类型所属的命名空间重复的问题,继续执行步骤S210及其之后的操作;
步骤S208,将上述重复的命名空间的类型计数增加1,执行步骤S214;
步骤S210,将命名空间名称按约定的格式组成命名空间字符串;
为了便于区别命名空间所属的文件和降低数据的碰撞率,需要将步骤S204中得到的命名空间名称按约定的格式组成命名空间字符串,在本实施例中,优选地,约定的命名空间字符串格式如表2所示:
表2
PublicKeyToken | 连接符(.) | Namespace |
其中,PublicKeyToken为公钥标记,在.net编译器对HelloWorld程序进行强签名时,会生成一个HelloWorld.snk文件,HelloWorld.snk中包含有公钥和私钥,上述HelloWorld代码被编译器编译后得到PE文件,并对PE文件计算散列值,编译器使用私钥对上述散列值进行签名,并将公钥嵌入到PE文件中,嵌入的公钥即为PublicKey,PublicKeyToken为对PublicKey进行散列运算,并取后八位所得到,在本实施例中,以PublicKeyToken是38 05 F8 26 9D 52 A5 B2为例,在本实施例中,优选地,连接符采用“.”表示,由此得到命名空间字符串为3805F8269D52A5B2.MyCompany.MyOnCardApp;
上述连接符还可以为“-”、“_”、空格等,并不局限于“.”;
在本步骤中,还需将该命名空间名称的类型计数置为1,用以表示该命名空间至少存在一个类型;
步骤S212,对命名空间字符串进行散列运算,并从中取约定的位数作为压缩后的命名空间名称;
其中,进行散列运算可以采用MD5、SHA-1、SHA-2等算法,在本实施例中优选地采用MD5算法,对命名空间字符串“3805F8269D52A5B2.MyCompany.MyOnCardApp”进行散列计算得到一个120位的计算结果;在本实施例中,优选地,将此120的计算结果取前三个字节作为压缩结果,为了使得数据字节对齐,还可以在最后补上“00”,得到压缩后的命名空间名称“ACE6EB00”;
上述压缩后的命名空间名称采用小端的方式排列,如采用大端的排列方式为00EBE6AC,一般在计算机中的存储采用大端的方式排列,基于X86的智能卡芯片中采用小端的方式排列;
这里需要说明的是,命名空间字符串中的PublicKeyToken需要区分大小写,避免相同的PublicKeyToken因为大小写的问题导致散列计算结果运算不一致问题;
步骤S214,判断是否所有类型所属的命名空间名称都已经被读取过,如果是,执行步骤S216,如果不是,读取下一个类型所属的命名空间的命名空间名称,即,返回步骤S204;
判断是否所有类型所属的命名空间名称都已经被读取过的依据是看是否将元数据表中的所有行都读完,如果都读过,说明所有类型所属的命名空间名称都已经被读取过,否则,说明不是所有类型所属的命名空间名称都被读取过;
步骤S216,压缩程序按照约定的格式组织压缩后的命名空间名称和该命名空间的类型计数,得到命名空间的压缩结果;
在本实施例中,优选地,约定的格式,即经过压缩程序压缩后的命名空间的结构为:
表3
类型计数 | 命名空间名称 |
表3中的类型计数为该命名空间所包含的类型的类型计数;
其中,在步骤S214中,当元数据表中包含的所有类型所属的命名空间名称都被读出并压缩完成后,可以得到所有的命名空间名称的压缩结果,并得到了所有命名空间所包含的类型的类型计数;
以步骤S212中所得到的命名空间的压缩结果为例进行说明,其中,命名空间MyCompany.MyOnCardApp存在3个类型,可以得到压缩后的命名空间如下:
0300 ACE6EB00
上述压缩后的命名空间采取的是小端的表示方法。
上述压缩结果中命名空间的压缩结构仅为最优的结构,该结构可以做相应的变换,例如将该命名空间的类型计数置于压缩后的命名空间名称后,或将类型计数的值进行同等编码变换等,这里不再详述。
本实施例对命名空间的压缩过程,仅以读取元数据表中的一个类型的命名空间进行了说明,在实际的操作过程中,一个.net文件中可能包含一个或多个命名空间,并且每个命名空间中包括多个类型,实际应用中应对元数据表中所有的类型逐个读取对应的命名空间,取出其命名空间名称,并对取出的不相同的命名空间名称进行压缩,同时对每个命名空间的类型进行类型计数,并按照上述方法得到压缩后的命名空间。其中,对.net文件中元数据表中的每个类型对应的命名空间进行读取时都可以采用本实施例提供的方法。
下面给出对一个.net文件的命名空间压缩后得到的结果:
Namespace:
(0)0100 D93DEB00//367DB8A346085E5D.System.Runtime.Remoting
(1)0100 6E880000
//367DB8A346085E5D.System.Runtime.Remoting.Channels
(2)0100 1178D900//
367DB8A346085E5D.SmartCard.Runtime.Remoting.Channels.APDU
(3)0200 00F64D00//D9E1E811B0CFFB39.System
(5)0100 1C5DD200//367DB8A346085E5D.System
(6)0400 00F64D00//D9E1E811B0CFFB39.System
(A)0100 1C5DD200//367DB8A346085E5D.System
(B)0200 C438E300//
CB18F1DFA0E7655B.MyCompany.MyOnCardApp
(D)0100 00F64D00//D9E1E811B0CFFB39.System
上述结果均采用小端的表示方式,例如第一条压缩结果,0100为命名空间System.Runtime.Remoting所包含的类型的类型计数,即命名空间System.Runtime.Remoting包括0001个类型,即一个类型,后4个字节为该.net文件中对命名空间名称System.Runtime.Remoting的压缩结果,“//”后为组成的命名空间字符串,以下(1)至(D)均采用的上述结构,不再一一解释;
本实施例提供的命名空间的压缩方法,通过获取命名空间名称,并按照约定格式将其压缩,可以对命名空间进行较好的压缩,进而能够节省存储.net文件需要的空间,尤其对于将.net文件运行在智能卡中,而该智能卡的数据存储又比较有限的情况下,可以通过本实施例提供的压缩方法实现.net文件的运行,增强了智能卡的性能。
实施例3
本实施例提供了一种.net文件中命名空间的压缩装置,如图4所示,该装置包括:
命名空间名称获取模块302,用于获取.net文件中当前类型所属的命名空间名称;
优选的,本实施例中命名空间名称获取模块302的获取方法可以具体为:获取.net文件中包含命名空间名称偏移的元数据表;从上述元数据表中获取上述当前类型所属的命名空间名称。
其中,在.net文件中包含有多个表,其中包含命名空间信息的元数据表有定义类型或接口表TypeDef,引用类型表TypeRef。
压缩模块304,用于按照预先确定的算法对命名空间名称获取模块302获取的命名空间名称进行压缩;
其中,预先确定的算法可以是先将上述命名空间名称组成命名空间字符串;对该命名空间字符串进行散列运算得到散列值;取该散列值中预定的字节作为压缩后的命名空间名称。其中,散列运算采用的算法可以是:MD5、SHA-1或SHA-2等。
类型计数确定模块306,用于确定命名空间名称获取模块302获取的命名空间名称对应的类型计数,其中,类型计数是指在该命名空间中包括的类型的个数;
优选的,类型计数确定模块306可以通过下述方法确定命名空间的类型计数:
当上述命名空间名称是第一次获取时(即:之前没有获取过此命名空间名称),将上述命名空间名称对应的类型计数置1,以后每获取一次上述命名空间名称,就将该类型计数加1,直至遍历完上述元数据表。
组合模块308,用于按照预先确定的格式对压缩模块304压缩后的命名空间名称和类型计数确定模块306确定的类型计数进行组合,得到命名空间名称对应的命名空间的压缩结果。
其中,预先确定的格式可以为固定长度的字节,在此固定长度的字节中包含两部分,一部分字节为上述类型计数,另一部分剩余字节为上述压缩后的命名空间名称。其中,该类型计数可以位于上述压缩后的命名空间名称之前或之后。该类型计数可以采用二进制编码、八进制编码、十进制编码、十六进制编码或ASCII码等。
优选的,本实施例提供的.net文件中命名空间的压缩装置还可以包括:
判断模块,用于判断命名空间名称获取模块302是否将所有类型所属的命名空间名称都已经读取到;如果是,触发组合模块308按照预先确定的格式对压缩后的上述命名空间名称和上述类型计数进行组合;否则,触发命名空间名称获取模块302读取下一个类型所属的命名空间名称。
本实施例的压缩模块304对命名空间名称获取模块302获取到的命名空间名称进行压缩,并且组合模块308将压缩后的命名空间名称与类型计数确定模块306确定的类型计数组合,得到压缩后的命名空间,可以有效地降低.net文件占用的存储空间,使.net文件可以在小容量存储介质(例如:智能卡)上存储并运行,进而增强了小容量存储介质(例如:智能卡)的功能。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
此外,上述可执行指令可以存储于存储介质中,术语“存储介质”可以表示用于存储数据的一种或多种装置,包括只读存储器(ROM)、随机存取存储器(RAM)、磁RAM、磁心存储器、磁盘存储介质、光存储介质、闪存装置和/或用于存储信息的其他机器可读介质。术语“机器可读介质”包括但不限于便携式或固定存储装置、光存储装置、无线通道或能够存储、容纳、或承载指令和/或数据的各种其他介质。
另外,可以通过硬件、软件、固件、中间件、微码、硬件描述语言或其组合来实现实施例。当用软件、固件、中间件或微码来实现时,可以在诸如存储介质的机器可读介质中存储用于执行必要任务的程序代码或码段。(多个)处理器可以执行必要任务。码段可以表示进程、函数、子程序、程序、例行程序、子例行程序、模块、对象、软件包、类、或指令、数据结构、或程序语言的任意组合。通过传输和/或接收信息、数据、自变量、或存储内容来将码段耦合到另一码段或硬件电路。信息、自变量、参数、数据等可以经由包括存储器共享、消息传递、令牌传递、网络传输等的任意合适方式来传递、传输、或传送。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种.net文件中命名空间的压缩方法,其特征在于,所述方法包括:
获取.net文件中当前类型所属的命名空间名称;
按照预先确定的算法对所述命名空间名称进行压缩;
确定所述命名空间名称对应的类型计数,所述类型计数是指在该命名空间中包括的类型的个数;
按照预先确定的格式对压缩后的所述命名空间名称和所述类型计数进行组合,得到所述命名空间名称对应的命名空间的压缩结果,
其中,
所述按照预先确定的算法对所述命名空间名称进行压缩的步骤包括:将所述命名空间名称组成命名空间字符串;对所述命名空间字符串进行散列运算得到散列值;取所述散列值中预定的字节作为压缩后的所述命名空间名称,
所述预先确定的格式为固定长度的字节,所述固定长度的字节的一部分字节为所述类型计数,剩余字节为所述压缩后的命名空间名称。
2.根据权利要求1所述的方法,其特征在于,所述获取.net文件中当前类型所属的命名空间名称的步骤之后还包括:
判断当前获取的所述命名空间名称是否已被获取过,如果没有,执行所述按照预先确定的算法对所述命名空间名称进行压缩的步骤。
3.根据权利要求1所述的方法,其特征在于,所述获取.net文件中当前类型所属的命名空间名称的步骤包括:
获取.net文件中包含命名空间名称偏移的元数据表;
从所述元数据表中获取所述当前类型所属的命名空间名称偏移;
根据所述命名空间名称偏移从“#Strings”流中读取所述命名空间名称。
4.根据权利要求3所述的方法,其特征在于,所述确定所述命名空间名称对应的类型计数包括:
当所述命名空间名称是第一次获取时,将所述命名空间名称对应的类型计数置1,以后每获取一次所述命名空间名称,将所述类型计数加1,直至遍历完所述元数据表。
5.根据权利要求3所述的方法,其特征在于,所述元数据表包括:
定义类型或接口表TypeDef,引用类型表TypeRef。
6.根据权利要求1所述的方法,其特征在于,所述将所述命名空间名称组成命名空间字符串包括:使用连接符将所述.net文件的公钥标记与所述命名空间名称连接得到命名空间字符串。
7.根据权利要求1所述的方法,其特征在于,所述散列运算采用的算法为:
MD5、SHA-1或SHA-2。
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
判断是否所有类型所属的命名空间名称都已经读取到;
如果是,执行所述按照预先确定的格式对压缩后的所述命名空间名称和所述类型计数进行组合的步骤;
否则,读取下一个类型所属的命名空间名称。
9.根据权利要求1所述的方法,其特征在于,所述类型计数位于所述压缩后的命名空间名称之前。
10.一种.net文件中命名空间的压缩装置,其特征在于,所述装置包括:
命名空间名称获取模块,用于获取.net文件中当前类型所属的命名空间的命名空间名称;
压缩模块,用于按照预先确定的算法对所述命名空间名称获取模块获取的命名空间名称进行压缩;
类型计数确定模块,用于确定所述命名空间名称获取模块获取的命名空间名称对应的类型计数,所述类型计数是指在该命名空间中包括的类型的个数;
组合模块,用于按照预先确定的格式对所述压缩模块压缩后的所述命名空间名称和所述类型计数确定模块确定的类型计数进行组合,得到所述命名空间名称对应的命名空间的压缩结果,
其中,
所述按照预先确定的算法对所述命名空间名称进行压缩的步骤包括:将所述命名空间名称组成命名空间字符串;对所述命名空间字符串进行散列运算得到散列值;取所述散列值中预定的字节作为压缩后的所述命名空间名称,
所述预先确定的格式为固定长度的字节,所述固定长度的字节的一部分字节为所述类型计数,剩余字节为所述压缩后的命名空间名称。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910244164A CN101770368B (zh) | 2009-12-30 | 2009-12-30 | .net文件中命名空间的压缩方法和装置 |
US13/129,296 US8805801B2 (en) | 2009-12-30 | 2010-12-29 | Method for compressing a .net file |
PCT/CN2010/080459 WO2011079796A1 (zh) | 2009-12-30 | 2010-12-29 | .net文件压缩方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910244164A CN101770368B (zh) | 2009-12-30 | 2009-12-30 | .net文件中命名空间的压缩方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101770368A CN101770368A (zh) | 2010-07-07 |
CN101770368B true CN101770368B (zh) | 2012-09-05 |
Family
ID=42503247
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910244164A Expired - Fee Related CN101770368B (zh) | 2009-12-30 | 2009-12-30 | .net文件中命名空间的压缩方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101770368B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011079796A1 (zh) * | 2009-12-30 | 2011-07-07 | 北京飞天诚信科技有限公司 | .net文件压缩方法 |
CN106934066B (zh) * | 2017-03-31 | 2024-06-18 | 联想(北京)有限公司 | 一种元数据处理方法、装置和存储设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101035015A (zh) * | 2006-01-17 | 2007-09-12 | 国际商业机器公司 | 用于维护命名空间中联合命名上下文绑定的方法和装置 |
CN101196830A (zh) * | 2007-12-12 | 2008-06-11 | 浙江大学 | 一种j2ee应用服务器高性能jndi服务的实现方法 |
-
2009
- 2009-12-30 CN CN200910244164A patent/CN101770368B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101035015A (zh) * | 2006-01-17 | 2007-09-12 | 国际商业机器公司 | 用于维护命名空间中联合命名上下文绑定的方法和装置 |
CN101196830A (zh) * | 2007-12-12 | 2008-06-11 | 浙江大学 | 一种j2ee应用服务器高性能jndi服务的实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101770368A (zh) | 2010-07-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
TWI730654B (zh) | 部署和執行智能合約的方法及裝置 | |
US8180741B2 (en) | Methods and systems for providing data objects on a token | |
EP1749266B1 (en) | System and method to conditionally shrink an executable module | |
JP2007080278A (ja) | 埋め込み符号を持ったコンピュータ命令値フィールド | |
CN112506569B (zh) | 一种字节码执行方法、字节码执行装置及终端设备 | |
CN106960140A (zh) | 虚拟机指令的混淆方法及装置、虚拟机保护系统 | |
CN110597814A (zh) | 结构化数据的序列化、反序列化方法以及装置 | |
US8805801B2 (en) | Method for compressing a .net file | |
CN112486490B (zh) | 前端代码打包方法、装置、电子设备及存储介质 | |
WO2021120713A1 (zh) | 一种数据处理方法、解码电路及处理器 | |
CN101770368B (zh) | .net文件中命名空间的压缩方法和装置 | |
CN106033551A (zh) | 数据解析方法、装置及系统 | |
CN113296854B (zh) | 一种数据加载方法、系统、电子设备及存储介质 | |
CN115906014A (zh) | 一种数据处理方法及相关装置 | |
CN109408191A (zh) | 页面更新方法、装置、设备及存储介质 | |
CN101794220B (zh) | .net文件中定义类型的压缩方法和装置 | |
CN111324645B (zh) | 区块链的数据处理方法及装置 | |
CN101794221B (zh) | .net文件中引用类型的压缩方法和装置 | |
CN102012804B (zh) | 一种智能卡cos指令扩展方法 | |
CN114201176A (zh) | 一种智能合约编译匹配方法、装置、设备和存储介质 | |
EP3026551A1 (en) | Methods and devices for compressing byte code for smart cards | |
CN113672483B (zh) | 一种设备日志存储方法、装置、电子设备及介质 | |
CN117130721B (zh) | WebAssembly代码的执行方法及装置 | |
CN116700840B (zh) | 文件执行方法、装置、电子设备及可读存储介质 | |
WO2024169618A1 (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 | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120905 |