一种智能卡处理CAP文件的方法转让专利

申请号 : CN201110460179.5

文献号 : CN102591735B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陆舟于华章

申请人 : 飞天诚信科技股份有限公司

摘要 :

本发明公开一种智能卡处理CAP文件的方法,该方法包括以下步骤:智能卡与外部终端建立连接,进行初始化,接收CAP文件对应的APDU命令,将所述APDU命令包含的数据存储到通信缓冲区,对卡片的第一状态标志位的取值进行判断,针对不同的第二状态标志位的取值进行不同的操作;本发明提供的一种智能卡处理CAP文件的方法,能够有效的利用智能卡存储资源,提高CAP文件的下载速度和保证下载过程中CAP文件及智能卡中内容的完整性。

权利要求 :

1.一种智能卡处理CAP文件的方法,其特征在于,包括以下步骤:

A、智能卡与外部终端建立连接,并进行初始化;

B、所述智能卡接收CAP文件对应的应用程序数据协议单元APDU命令,将所述APDU命令包含的数据存储到通信缓冲区;

C、所述智能卡对第一状态标志位的取值进行判断,如果所述第一状态标志位的取值为第一预设值,则执行步骤D;如果所述第一状态标志位的取值为第二预设值,则执行步骤E;

如果所述第一状态标志位的取值为第三预设值,则执行步骤F;如果所述第一状态标志位的取值为第四预设值,则执行步骤G;如果所述第一状态标志位的取值为第五预设值,则执行步骤H;如果所述第一状态标志位的取值为第六预设值,则执行步骤I;如果所述第一状态标志位的取值为第七预设值,则执行步骤J;如果所述第一状态标志位的取值为第八预设值,则执行步骤K;如果所述第一状态标志位的取值为第九预设值,则执行步骤L;如果所述第一状态标志位的取值为第十预设值,则执行步骤M;

D、所述智能卡从所述通信缓冲区读取头组件数据;当所述智能卡读取且未处理的头组件数据的大小与所述智能卡读取到的头组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的头组件数据进行处理;当所述智能卡未读取完头组件包含的所有头组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述头组件包含的所有头组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第二预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;

否则,返回步骤B;

E、所述智能卡从所述通信缓冲区读取目录组件数据;当所述智能卡读取且未处理的目录组件数据的大小与所述智能卡读取到的目录组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的目录组件数据进行处理;当所述智能卡未读取完目录组件包含的所有目录组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述目录组件包含的所有目录组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第三预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

F、所述智能卡从所述通信缓冲区读取应用组件数据;当所述智能卡读取且未处理的应用组件数据的大小与所述智能卡读取到的应用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的应用组件数据进行处理;当所述智能卡未读取完应用组件包含的所有应用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述应用组件包含的所有应用组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第四预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

G、所述智能卡从所述通信缓冲区读取导入组件数据;当所述智能卡读取且未处理的导入组件数据的大小与所述智能卡读取到的导入组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的导入组件数据进行处理;当所述智能卡未读取完导入组件包含的所有导入组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述导入组件包含的所有导入组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第五预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

H、所述智能卡从所述通信缓冲区读取类组件数据;当所述智能卡未读取完类组件包含的所有类组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述类组件包含的所有类组件数据时,所述智能卡处理所述类组件,将所述第一状态标志位的取值修改为所述第六预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

I、所述智能卡从所述通信缓冲区读取方法组件数据;当所述智能卡未读取完方法组件包含的所有方法组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述方法组件包含的所有方法组件数据时,所述智能卡处理所述方法组件,将所述第一状态标志位的取值修改为所述第七预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

J、所述智能卡从所述通信缓冲区读取静态域组件数据;当所述智能卡读取且未处理的静态域组件数据的大小与所述智能卡读取到的静态域组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的静态域组件数据进行处理;当所述智能卡未读取完所述静态域组件包含的所有静态域组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述静态域组件包含的所有静态域组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第八预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

K、所述智能卡从所述通信缓冲区读取导出组件数据;当所述智能卡未读取完导出组件包含的所有导出组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述导出组件包含的所有导出组件数据时,所述智能卡处理所述导出组件,将所述第一状态标志位的取值修改为所述第九预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

L、所述智能卡从所述通信缓冲区读取常量池组件数据;当所述智能卡未读取完常量池组件包含的所有常量池组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述常量池组件包含的所有常量池组件数据时,所述智能卡处理所述常量池组件,将所述第一状态标志位的取值修改为所述第十预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;

M、所述智能卡从所述通信缓冲区读取位置引用组件数据;当所述智能卡读取且未处理的位置引用组件数据的大小与所述智能卡读取到的位置引用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的位置引用组件数据进行处理;当所述智能卡未读取完所述位置引用组件包含的所有位置引用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述位置引用组件包含的所有位置引用组件数据均处理完毕后,结束流程。

2.如权利要求1所述的方法,其特征在于,所述智能卡处理所述常量池组件之前,还包括:

所述智能卡从所述目录组件中获取所述常量池组件的大小信息,判断所述常量池组件的大小是否大于随机存储器的可用存储空间,如果大于所述可用存储空间,则根据所述常量池组件的大小信息在非易失存储器为所述常量池组件分配存储空间;如果不大于所述可用存储空间,则根据所述常量池组件的大小信息在所述随机存储器为所述常量池组件分配存储空间;

所述智能卡处理所述常量池组件,包括:

所述智能卡将所述常量池组件存储到为所述常量池组件分配的存储空间中;

所述智能卡更新所述常量池组件中的常量池表项数组元素。

3.如权利要求2所述的方法,其特征在于,所述智能卡更新所述常量池组件中的常量池表项数组元素之前,还包括:

所述智能卡从所述常量池组件中获取所述常量池表项数组的元素个数,将第一计数器的计数值设置为所述常量池表项数组的元素个数;

所述智能卡更新所述常量池组件中的常量池表项数组元素,包括:

步骤a、所述智能卡从所述常量池组件中获取一个未解析的常量池表项数组元素,根据获取的当前元素的标签判断所述当前元素的类型,如果所述当前元素的类型为类引用,则执行步骤b;如果所述当前元素的类型为实例引用,则执行步骤c;如果所述当前元素的类型为父类方法引用,则执行步骤d;如果所述当前元素的类型为虚拟方法引用,则执行步骤f;如果所述当前元素的类型为静态域引用,则执行步骤j;如果所述当前元素的类型为静态方法引用,则执行步骤k;

步骤b、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类标识,根据所述导入包类标识获取导入包类虚拟机标识,使用所述导入包类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内类标识,根据所述包内类标识获取包内类虚拟机标识,使用所述包内类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤c、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类实例标识,根据所述导入包类标识获取导入包类虚拟机标识,根据所述导入包类虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取导入包类引用标识,根据所述导入包类引用标识获取导入包类实例的大小信息,使用所述导入包类实例的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内类标识,根据所述包内类标识获取包内类虚拟机标识,根据所述包内类虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取包内类引用标识,根据所述包内类引用标识获取包内类实例的大小信息,使用所述包内类实例的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内类实例标识,根据所述包内类实例标识获取包内类实例虚拟机标识,根据所述包内类实例虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取包内类实例引用标识,根据所述包内类实例引用标识获取包内类实例引用的大小信息,使用所述包内类实例引用的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤d、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位不为1,则执行步骤e;如果所述最高位为1,则执行步骤f;

步骤e、所述智能卡根据所述当前元素获取包内父类标识,根据所述包内父类标识获取包内父类虚拟机标识,根据所述包内父类虚拟机标识获取包内父类方法标识,根据所述包内父类方法标识获取包内父类方法虚拟机标识,使用所述包内父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤f、所述智能卡根据所述当前元素获取导入包标识以及方法标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取当前导入包父类标识;

步骤g、所述智能卡根据所述当前导入包父类标识获取所述导入包父类虚拟机标识,根据所述导入包父类虚拟机标识获取方法表,根据所述方法表获取方法表基数,判断所述方法表基数是否小于等于所述方法标识,如果所述方法表基数小于所述方法标识,则执行步骤h;如果所述方法表基数大于所述方法标识,则执行步骤i;

步骤h、所述智能卡从所述方法表中获取导入包父类方法虚拟机标识,使用所述导入包父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤i、所述智能卡根据所述当前导入包父类标识获取对应的导入包父类,从所述导入包父类中获取所述导入包父类的父类的标识,判断所述导入包父类的父类的标识是否为非法标识,如果所述导入包父类的父类的标识为所述非法标识,则返回步骤m;如果所述导入包父类的父类的标识不是所述非法标识,则使用所述导入包父类的父类的标识替换所述当前导入包父类标识,并返回步骤g;

步骤j、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态域标识,根据所述导入包静态域标识获取导入包静态域虚拟机标识,使用所述导入包静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内静态域标识,根据所述包内静态域标识获取包内静态域虚拟机标识,使用所述包内静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤k、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态方法标识,根据所述导入包静态方法标识获取导入包静态方法虚拟机标识,使用所述导入包静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内静态方法标识,根据所述包内静态方法标识获取包内静态方法虚拟机标识,使用所述包内静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤m、所述智能卡将所述第一计数器的计数值减1,判断所述第一计数器的计数值是否为零,如果所述计数值为零,则清空所述常量池组件中除所述常量池表项数组外的内容占用的存储空间;如果所述计数值不为零,则返回步骤a。

4.如权利要求1所述的方法,其特征在于,所述智能卡处理所述位置引用组件数据,包括:

所述智能卡根据所述位置引用组件数据获取常量池索引在所述方法组件中的偏移地址;

所述智能卡根据所述偏移地址获取所述常量池索引,根据所述常量池索引获取对应的常量池表项数组的内容;

所述智能卡使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述常量池索引。

5.如权利要求4所述的方法,其特征在于,所述常量池索引包括第一常量池索引和第二常量池索引;

所述智能卡处理所述位置引用组件数据,包括:

①、所述智能卡对第二状态标志位的取值进行判断,如果所述第二状态标志位的取值为第十一预设值时,则执行步骤②;如果所述第二状态标志位的取值为第十二预设值时,则执行步骤③;如果所述第二状态标志位的取值为第十三预设值时,执行步骤④;如果所述第二状态标志位的取值为第十四预设值时,执行步骤⑤;如果所述第二状态标志位的取值为第十五预设值时,执行步骤⑥;如果所述第二状态标志位的取值为第十六预设值时,执行步骤⑦;

②、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的高字节,根据所述高字节设置第二计数器的计数值,将所述第二状态标志位的取值修改为所述第十二预设值,并返回步骤①;

③、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的低字节,根据所述低字节更新所述第二计数器的计数值,将所述第二状态标志位的取值修改为所述第十三预设值,并返回步骤①;

④、所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,根据所述单字节索引数组元素获取第一常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第一常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第一常量池索引,将所述第二计数器的计数值减1,判断所述第二计数器的计数值是否等于0,如果所述第二计数器的计数值不等于0,则返回步骤①;如果所述第二计数器的计数值等于0,则将所述第二状态标志位的取值修改为所述第十四预设值,并返回步骤①;

⑤、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的高字节,根据所述高字节设置第三计数器的计数值,将所述第二状态标志位的取值修改为所述第十五预设值,并返回步骤①;

⑥、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的低字节,根据所述低字节更新所述第三计数器的计数值,将所述第二状态标志位的取值修改为所述第十六预设值,并返回步骤①;

⑦、所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,根据所述双字节索引数组元素获取第二常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第二常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第二常量池索引,将所述第三计数器的计数值减1,判断所述第三计数器的计数值是否等于0,如果所述第三计数器的计数值不等于0,则返回步骤①;如果所述第三计数器的计数值等于0,则确定对所述位置引用组件处理完毕。

6.如权利要求5所述的方法,其特征在于,所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,包括:

所述智能卡从所述位置引用组件数据中获取单字节索引数组中的未处理的当前操作数据,判断所述单字节索引数组中的所述当前操作数据是否小于255,如果所述单字节索引数组中的所述当前操作数据不小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与255之和,并返回步骤①;如果所述单字节索引数组中的所述当前操作数据小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与所述单字节索引数组中的所述当前操作数之和,将所述第四计数器的计数值作为所述未处理的单字节索引数组元素;

所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,包括:

所述智能卡从所述位置引用组件数据中获取双字节索引数组中的未处理的当前操作数据,判断所述双字节索引数组中的所述当前操作数据是否小于255,如果所述双字节索引数组中的所述当前操作数据不小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与255之和,并返回步骤①;如果所述双字节索引数组中的所述当前操作数据小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与所述双字节索引数组中的所述当前操作数之和,将所述第五计数器的计数值作为所述未处理的双字节索引数组元素。

7.一种智能卡处理CAP文件的方法,其特征在于,包括以下步骤:

A、智能卡与外部终端建立连接,并进行初始化;

B、所述智能卡接收CAP文件对应的应用程序数据协议单元APDU命令,将所述APDU命令包含的数据存储到通信缓冲区;

C、所述智能卡对所述APDU命令中的状态参数进行判断,如果所述状态参数的取值为第一预设值,则执行步骤D;如果所述状态参数的取值为第二预设值,则执行步骤E;如果所述状态参数的取值为第三预设值,则执行步骤F;如果所述状态参数的取值为第四预设值,则执行步骤G;如果所述状态参数的取值为第五预设值,则执行步骤H;如果所述状态参数的取值为第六预设值,则执行步骤I;如果所述状态参数的取值为第七预设值,则执行步骤J;如果所述状态参数的取值为第八预设值,则执行步骤K;如果所述状态参数的取值为第九预设值,则执行步骤L;如果所述状态参数的取值为第十预设值,则执行步骤M;

D、所述智能卡从所述通信缓冲区读取头组件数据;当所述智能卡读取且未处理的头组件数据的大小与所述智能卡读取到的头组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的头组件数据进行处理;当所述智能卡未读取完头组件包含的所有头组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述头组件包含的所有头组件数据均处理完毕后,返回步骤B;

E、所述智能卡从所述通信缓冲区读取目录组件数据;当所述智能卡读取且未处理的目录组件数据的大小与所述智能卡读取到的目录组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的目录组件数据进行处理;当所述智能卡未读取完目录组件包含的所有目录组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述目录组件包含的所有目录组件数据均处理完毕后,返回步骤B;

F、所述智能卡从所述通信缓冲区读取应用组件数据;当所述智能卡读取且未处理的应用组件数据的大小与所述智能卡读取到的应用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的应用组件数据进行处理;当所述智能卡未读取完应用组件包含的所有应用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述应用组件包含的所有应用组件数据均处理完毕后,返回步骤B;

G、所述智能卡从所述通信缓冲区读取导入组件数据;当所述智能卡读取且未处理的导入组件数据的大小与所述智能卡读取到的导入组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的导入组件数据进行处理;当所述智能卡未读取完导入组件包含的所有导入组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述导入组件包含的所有导入组件数据均处理完毕后,返回步骤B;

H、所述智能卡从所述通信缓冲区读取类组件数据;当所述智能卡未读取完类组件包含的所有类组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述类组件包含的所有类组件数据时,所述智能卡处理所述类组件,并返回步骤B;

I、所述智能卡从所述通信缓冲区读取方法组件数据;当所述智能卡未读取完方法组件包含的所有方法组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述方法组件包含的所有方法组件数据时,所述智能卡处理所述方法组件,并返回步骤B;

J、所述智能卡从所述通信缓冲区读取静态域组件数据;当所述智能卡读取且未处理的静态域组件数据的大小与所述智能卡读取到的静态域组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的静态域组件数据进行处理;当所述智能卡未读取完静态域组件包含的所有静态域组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述静态域组件包含的所有静态域组件数据均处理完毕后,返回步骤B;

K、所述智能卡从所述通信缓冲区读取导出组件数据;当所述智能卡未读取完导出组件包含的所有导出组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述导出组件包含的所有导出组件数据时,所述智能卡处理所述导出组件,并返回步骤B;

L、所述智能卡从所述通信缓冲区读取常量池组件数据;当所述智能卡未读取完常量池组件包含的所有常量池组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述常量池组件包含的所有常量池组件数据时,所述智能卡处理所述常量池组件,并返回步骤B;

M、所述智能卡从所述通信缓冲区读取位置引用组件数据;当所述智能卡读取且未处理的位置引用组件数据的大小与所述智能卡读取到的位置引用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的位置引用组件数据进行处理;当所述智能卡未读取完位置引用组件包含的所有位置引用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述位置引用组件包含的所有位置引用组件数据均处理完毕后,结束流程。

8.如权利要求7所述的方法,其特征在于,所述智能卡处理所述常量池组件之前,还包括:

所述智能卡从所述目录组件中获取所述常量池组件的大小信息,判断所述常量池组件的大小是否大于随机存储器的可用存储空间,如果大于所述可用存储空间,则根据所述常量池组件的大小信息在非易失存储器为所述常量池组件分配存储空间;如果不大于所述可用存储空间,则根据所述常量池组件的大小信息在所述随机存储器为所述常量池组件分配存储空间;

所述智能卡处理所述常量池组件,包括:

所述智能卡将所述常量池组件存储到所述常量池组件分配的存储空间中;

所述智能卡更新所述常量池组件中的常量池表项数组元素。

9.如权利要求8所述的方法,其特征在于,所述智能卡更新所述常量池组件中的常量池表项数组元素之前,还包括:

所述智能卡从所述常量池组件中获取所述常量池表项数组的元素个数,将第一计数器的计数值设置为所述常量池表项数组的元素个数;

所述智能卡更新所述常量池组件中的常量池表项数组元素,包括:

步骤a、所述智能卡从所述常量池组件中获取一个未解析的常量池表项数组元素,根据获取的当前元素的标签判断所述当前元素的类型,如果所述当前元素的类型为类引用,则执行步骤b;如果所述当前元素的类型为实例引用,则执行步骤c;如果所述当前元素的类型为父类方法引用,则执行步骤d;如果所述当前元素的类型为虚拟方法引用,则执行步骤f;如果所述当前元素的类型为静态域引用,则执行步骤j;如果所述当前元素的类型为静态方法引用,则执行步骤k;

步骤b、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类标识,根据所述导入包类标识获取导入包类虚拟机标识,使用所述导入包类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内类标识,根据所述包内类标识获取包内类虚拟机标识,使用所述包内类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤c、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类标识,根据所述导入包类标识获取导入包类虚拟机标识,根据所述导入包类虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取导入包类引用标识,根据所述导入包类引用标识获取导入包类实例的大小信息,使用所述导入包类实例大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内类实例标识,根据所述包内类实例标识获取包内类实例虚拟机标识,根据所述包内类实例虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取包内类实例引用标识,根据所述包内类实例引用标识获取包内类实例引用的大小信息,使用所述包内类实例引用的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤d、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位不为1,则执行步骤e;如果所述最高位为1,则执行步骤f;

步骤e、所述智能卡根据所述当前元素获取包内父类标识,根据所述包内父类标识获取包内父类虚拟机标识,根据所述包内父类虚拟机标识获取包内父类方法标识,根据所述包内父类方法标识获取包内父类方法虚拟机标识,使用所述包内父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤f、所述智能卡根据所述当前元素获取导入包标识以及方法标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取当前导入包父类标识;

步骤g、所述智能卡根据所述当前导入包父类标识获取所述导入包父类虚拟机标识,根据所述导入包父类虚拟机标识获取方法表,根据所述方法表获取方法表基数,判断所述方法表基数是否小于等于所述方法标识,如果所述方法表基数小于所述方法标识,则执行步骤h;如果所述方法表基数大于所述方法标识,则执行步骤i;

步骤h、所述智能卡从所述方法表中获取导入包父类方法虚拟机标识,使用所述导入包父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤i、所述智能卡根据所述当前导入包父类标识获取对应的导入包父类,从所述导入包父类中获取所述导入包父类的父类的标识,判断所述导入包父类的父类的标识是否为非法标识,如果所述导入包父类的父类的标识为所述非法标识,则返回步骤m;如果所述导入包父类的父类的标识不是所述非法标识,则使用所述导入包父类的父类的标识替换所述当前导入包父类标识,并返回步骤g;

步骤j、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态域标识,根据所述导入包静态域标识获取导入包静态域虚拟机标识,使用所述导入包静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内静态域标识,根据所述包内静态域标识获取包内静态域虚拟机标识,使用所述包内静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤k、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态方法标识,根据所述导入包静态方法标识获取导入包静态方法虚拟机标识,使用所述导入包静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

如果所述最高位不为1,则根据所述当前元素获取包内静态方法标识,根据所述包内静态方法标识获取包内静态方法虚拟机标识,使用所述包内静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;

步骤m、所述智能卡将所述第一计数器的计数值减1,判断所述第一计数器的计数值是否为零,如果所述计数值为零,则清空所述常量池组件中除所述常量池表项数组外的内容占用的存储空间;如果所述计数值不为零,则返回步骤a。

10.如权利要求7所述的方法,其特征在于,所述智能卡处理所述位置引用组件数据,包括:

所述智能卡根据所述位置引用组件数据,获取常量池索引在所述方法组件中的偏移地址;

所述智能卡根据所述偏移地址获取所述常量池索引,根据所述常量池索引获取对应的常量池表项数组的内容;

所述智能卡使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述常量池索引。

11.如权利要求10所述的方法,其特征在于,所述常量池索引包括第一常量池索引和第二常量池索引;

所述智能卡处理所述位置引用组件数据,包括:

①、所述智能卡对第二状态标志位的取值进行判断,如果所述第二状态标志位的取值为第十一预设值时,则执行步骤②;如果所述第二状态标志位的取值为第十二预设值时,则执行步骤③;如果所述第二状态标志位的取值为第十三预设值时,执行步骤④;如果所述第二状态标志位的取值为第十四预设值时,执行步骤⑤;如果所述第二状态标志位的取值为第十五预设值时,执行步骤⑥;如果所述第二状态标志位的取值为第十六预设值时,执行步骤⑦;

②、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的高字节,根据所述高字节设置第二计数器的计数值,将所述第二状态标志位的取值修改为所述第十二预设值,并返回步骤①;

③、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的低字节,根据所述低字节更新所述第二计数器的计数值,将所述第二状态标志位的取值修改为所述第十三预设值,并返回步骤①;

④、所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,根据所述单字节索引数组元素获取第一常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第一常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第一常量池索引,将所述第二计数器的计数值减1,判断所述第二计数器的计数值是否等于0,如果所述第二计数器的计数值不等于0,则返回步骤①;如果所述第二计数器的计数值等于0,则将所述第二状态标志位的取值修改为所述第十四预设值,并返回步骤①;

⑤、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的高字节,根据所述高字节设置第三计数器的计数值,将所述第二状态标志位的取值修改为所述第十五预设值,并返回步骤①;

⑥、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的低字节,根据所述低字节更新所述第三计数器的计数值,将所述第二状态标志位的取值修改为所述第十六预设值,并返回步骤①;

⑦、所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,根据所述双字节索引数组元素获取第二常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第二常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第二常量池索引,将所述第三计数器的计数值减1,判断所述第三计数器的计数值是否等于0,如果所述第三计数器的计数值不等于0,则返回步骤①;如果所述第三计数器的计数值等于0,则确定对所述位置引用组件处理完毕。

12.如权利要求11所述的方法,其特征在于,所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,包括:

所述智能卡从所述位置引用组件数据中获取单字节索引数组中的未处理的当前操作数据,判断所述单字节索引数组中的所述当前操作数据是否小于255,如果所述单字节索引数组中的所述当前操作数据不小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与255之和,并返回步骤①;如果所述单字节索引数组中的所述当前操作数据小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与所述单字节索引数组中的所述当前操作数之和,将所述第四计数器的计数值作为所述未处理的单字节索引数组元素;

所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,包括:

所述智能卡从所述位置引用组件数据中获取双字节索引数组中的未处理的当前操作数据,判断所述双字节索引数组中的所述当前操作数据是否小于255,如果所述双字节索引数组中的所述当前操作数据不小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与255之和,并返回步骤①;如果所述双字节索引数组中的所述当前操作数据小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与所述双字节索引数组中的所述当前操作数之和,将所述第五计数器的计数值作为所述未处理的双字节索引数组元素。

说明书 :

一种智能卡处理CAP文件的方法

技术领域

[0001] 本发明涉及智能卡领域,特别涉及一种智能卡处理CAP文件的方法。

背景技术

[0002] 智能卡是指卡内嵌有微芯片的卡片。目前,智能卡技术广泛应用于身份识别、支付工具、加密/解密、信息技术等方面。
[0003] 但由于智能卡平台资源有限,如Java卡虚拟机平台,在智能卡中不能直接存储类文件,在将Java程序类导入智能卡设备之前,需要通过转换装置转换成智能卡特有的文件格式,即以CAP为后缀的压缩文件。
[0004] 在现有技术中,智能卡处理CAP文件规范中未根据各组件特点提供处理CAP文件中组件数据的方法,将CAP文件存储在智能卡中,然而,该方法存在的缺陷为:占用智能卡大量的资源,增加存储管理成本,降低CAP文件的下载速度,且不能保证CAP文件的完整性。

发明内容

[0005] 为了实现在智能卡下载并解析CAP文件时占用内存资源少,提高CAP文件的下载速度和保证CAP文件在下载解析过程中的完整性,本发明提供了一种智能卡处理CAP文件的方法。
[0006] 1、一种智能卡处理CAP文件的方法,其特征在于,包括以下步骤:
[0007] A、智能卡与外部终端建立连接,并进行初始化;
[0008] B、所述智能卡接收CAP文件对应的应用程序数据协议单元APDU命令,将所述APDU命令包含的数据存储到通信缓冲区;
[0009] C、所述智能卡对第一状态标志位的取值进行判断,如果所述第一状态标志位的取值为第一预设值,则执行步骤D;如果所述第一状态标志位的取值为第二预设值,则执行步骤E;如果所述第一状态标志位的取值为第三预设值,则执行步骤F;如果所述第一状态标志位的取值为第四预设值,则执行步骤G;如果所述第一状态标志位的取值为第五预设值,则执行步骤H;如果所述第一状态标志位的取值为第六预设值,则执行步骤I;如果所述第一状态标志位的取值为第七预设值,则执行步骤J;如果所述第一状态标志位的取值为第八预设值,则执行步骤K;如果所述第一状态标志位的取值为第九预设值,则执行步骤L;如果所述第一状态标志位的取值为第十预设值,则执行步骤M;
[0010] D、所述智能卡从所述通信缓冲区读取头组件数据;当所述智能卡读取且未处理的头组件数据的大小与所述智能卡读取到的头组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的头组件数据进行处理;当所述智能卡未读取完头组件包含的所有头组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述头组件包含的所有头组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第二预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0011] E、所述智能卡从所述通信缓冲区读取目录组件数据;当所述智能卡读取且未处理的目录组件数据的大小与所述智能卡读取到的目录组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的目录组件数据进行处理;当所述智能卡未读取完目录组件包含的所有目录组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述目录组件包含的所有目录组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第三预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0012] F、所述智能卡从所述通信缓冲区读取应用组件数据;当所述智能卡读取且未处理的应用组件数据的大小与所述智能卡读取到的应用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的应用组件数据进行处理;当所述智能卡未读取完应用组件包含的所有应用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述应用组件包含的所有应用组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第四预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0013] G、所述智能卡从所述通信缓冲区读取导入组件数据;当所述智能卡读取且未处理的导入组件数据的大小与所述智能卡读取到的导入组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的导入组件数据进行处理;当所述智能卡未读取完导入组件包含的所有导入组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述导入组件包含的所有导入组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第五预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0014] H、所述智能卡从所述通信缓冲区读取类组件数据;当所述智能卡未读取完类组件包含的所有类组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述类组件包含的所有类组件数据时,所述智能卡处理所述类组件,将所述第一状态标志位的取值修改为所述第六预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0015] I、所述智能卡从所述通信缓冲区读取方法组件数据;当所述智能卡未读取完方法组件包含的所有方法组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述方法组件包含的所有方法组件数据时,所述智能卡处理所述方法组件,将所述第一状态标志位的取值修改为所述第七预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0016] J、所述智能卡从所述通信缓冲区读取静态域组件数据;当所述智能卡读取且未处理的静态域组件数据的大小与所述智能卡读取到的静态域组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的静态域组件数据进行处理;当所述智能卡未读取完所述静态域组件包含的所有静态域组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述静态域组件包含的所有静态域组件数据均处理完毕后,所述智能卡将所述第一状态标志位的取值修改为所述第八预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0017] K、所述智能卡从所述通信缓冲区读取导出组件数据;当所述智能卡未读取完导出组件包含的所有导出组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述导出组件包含的所有导出组件数据时,所述智能卡处理所述导出组件,将所述第一状态标志位的取值修改为所述第九预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0018] L、所述智能卡从所述通信缓冲区读取常量池组件数据;当所述智能卡未读取完常量池组件包含的所有常量池组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述常量池组件包含的所有常量池组件数据时,所述智能卡处理所述常量池组件,将所述第一状态标志位的取值修改为所述第十预设值,判断所述通信缓冲区是否存在未被读取的数据,如果存在,则返回步骤C;否则,返回步骤B;
[0019] M、所述智能卡从所述通信缓冲区读取位置引用组件数据;当所述智能卡读取且未处理的位置引用组件数据的大小与所述智能卡读取到的位置引用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的位置引用组件数据进行处理;当所述智能卡未读取完所述位置引用组件包含的所有位置引用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述位置引用组件包含的所有位置引用组件数据均处理完毕后,结束流程。
[0020] 2、如权利要求1所述的方法,其特征在于,所述智能卡处理所述常量池组件之前,还包括:
[0021] 所述智能卡从所述目录组件中获取所述常量池组件的大小信息,判断所述常量池组件的大小是否大于随机存储器的可用存储空间,如果大于所述可用存储空间,则根据所述常量池组件的大小信息在非易失存储器为所述常量池组件分配存储空间;如果不大于所述可用存储空间,则根据所述常量池组件的大小信息在所述随机存储器为所述常量池组件分配存储空间;
[0022] 所述智能卡处理所述常量池组件,包括:
[0023] 所述智能卡将所述常量池组件存储到为所述常量池组件分配的存储空间中;
[0024] 所述智能卡更新所述常量池组件中的常量池表项数组元素。
[0025] 3、如权利要求2所述的方法,其特征在于,所述智能卡更新所述常量池组件中的常量池表项数组元素之前,还包括:
[0026] 所述智能卡从所述常量池组件中获取所述常量池表项数组的元素个数,将第一计数器的计数值设置为所述常量池表项数组的元素个数;
[0027] 所述智能卡更新所述常量池组件中的常量池表项数组元素,包括:
[0028] 步骤a、所述智能卡从所述常量池组件中获取一个未解析的常量池表项数组元素,根据获取的当前元素的标签判断所述当前元素的类型,如果所述当前元素的类型为类引用,则执行步骤b;如果所述当前元素的类型为实例引用,则执行步骤c;如果所述当前元素的类型为父类方法引用,则执行步骤d;如果所述当前元素的类型为虚拟方法引用,则执行步骤f;如果所述当前元素的类型为静态域引用,则执行步骤j;如果所述当前元素的类型为静态方法引用,则执行步骤k;
[0029] 步骤b、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类标识,根据所述导入包类标识获取导入包类虚拟机标识,使用所述导入包类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0030] 如果所述最高位不为1,则根据所述当前元素获取包内类标识,根据所述包内类标识获取包内类虚拟机标识,使用所述包内类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0031] 步骤c、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类实例标识,根据所述导入包类标识获取导入包类虚拟机标识,根据所述导入包类虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取导入包类引用标识,根据所述导入包类引用标识获取导入包类实例的大小信息,使用所述导入包类实例的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0032] 如果所述最高位不为1,则根据所述当前元素获取包内类标识,根据所述包内类标识获取包内类虚拟机标识,根据所述包内类虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取包内类引用标识,根据所述包内类引用标识获取包内类实例的大小信息,使用所述包内类实例的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0033] 如果所述最高位不为1,则根据所述当前元素获取包内类实例标识,根据所述包内类实例标识获取包内类实例虚拟机标识,根据所述包内类实例虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取包内类实例引用标识,根据所述包内类实例引用标识获取包内类实例引用的大小信息,使用所述包内类实例引用的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0034] 步骤d、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位不为1,则执行步骤e;如果所述最高位为1,则执行步骤f;
[0035] 步骤e、所述智能卡根据所述当前元素获取包内父类标识,根据所述包内父类标识获取包内父类虚拟机标识,根据所述包内父类虚拟机标识获取包内父类方法标识,根据所述包内父类方法标识获取包内父类方法虚拟机标识,使用所述包内父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0036] 步骤f、所述智能卡根据所述当前元素获取导入包标识以及方法标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取当前导入包父类标识;
[0037] 步骤g、所述智能卡根据所述当前导入包父类标识获取所述导入包父类虚拟机标识,根据所述导入包父类虚拟机标识获取方法表,根据所述方法表获取方法表基数,判断所述方法表基数是否小于等于所述方法标识,如果所述方法表基数小于所述方法标识,则执行步骤h;如果所述方法表基数大于所述方法标识,则执行步骤i;
[0038] 步骤h、所述智能卡从所述方法表中获取导入包父类方法虚拟机标识,使用所述导入包父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0039] 步骤i、所述智能卡根据所述当前导入包父类标识获取对应的导入包父类,从所述导入包父类中获取所述导入包父类的父类的标识,判断所述导入包父类的父类的标识是否为非法标识,如果所述导入包父类的父类的标识为所述非法标识,则返回步骤m;如果所述导入包父类的父类的标识不是所述非法标识,则使用所述导入包父类的父类的标识替换所述当前导入包父类标识,并返回步骤g;
[0040] 步骤j、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态域标识,根据所述导入包静态域标识获取导入包静态域虚拟机标识,使用所述导入包静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0041] 如果所述最高位不为1,则根据所述当前元素获取包内静态域标识,根据所述包内静态域标识获取包内静态域虚拟机标识,使用所述包内静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0042] 步骤k、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态方法标识,根据所述导入包静态方法标识获取导入包静态方法虚拟机标识,使用所述导入包静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0043] 如果所述最高位不为1,则根据所述当前元素获取包内静态方法标识,根据所述包内静态方法标识获取包内静态方法虚拟机标识,使用所述包内静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0044] 步骤m、所述智能卡将所述第一计数器的计数值减1,判断所述第一计数器的计数值是否为零,如果所述计数值为零,则清空所述常量池组件中除所述常量池表项数组外的内容占用的存储空间;如果所述计数值不为零,则返回步骤a。
[0045] 4、如权利要求1所述的方法,其特征在于,所述智能卡处理所述位置引用组件数据,包括:
[0046] 所述智能卡根据所述位置引用组件数据获取常量池索引在所述方法组件中的偏移地址;
[0047] 所述智能卡根据所述偏移地址获取所述常量池索引,根据所述常量池索引获取对应的常量池表项数组的内容;
[0048] 所述智能卡使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述常量池索引。
[0049] 5、如权利要求4所述的方法,其特征在于,所述常量池索引包括第一常量池索引和第二常量池索引;
[0050] 所述智能卡处理所述位置引用组件数据,包括:
[0051] ①、所述智能卡对第二状态标志位的取值进行判断,如果所述第二状态标志位的取值为第十一预设值时,则执行步骤②;如果所述第二状态标志位的取值为第十二预设值时,则执行步骤③;如果所述第二状态标志位的取值为第十三预设值时,执行步骤④;如果所述第二状态标志位的取值为第十四预设值时,执行步骤⑤;如果所述第二状态标志位的取值为第十五预设值时,执行步骤⑥;如果所述第二状态标志位的取值为第十六预设值时,执行步骤⑦;
[0052] ②、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的高字节,根据所述高字节设置第二计数器的计数值,将所述第二标志位的取值修改为所述第十二预设值,并返回步骤①;
[0053] ③、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的低字节,根据所述低字节更新所述第二计数器的计数值,将所述第二标志位的取值修改为所述第十三预设值,并返回步骤①;
[0054] ④、所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,根据所述单字节索引数组元素获取第一常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第一常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第一常量池索引,将所述第二计数器的计数值减1,判断所述第二计数器的计数值是否等于0,如果所述第二计数器的计数值不等于0,则返回步骤①;如果所述第二计数器的计数值等于0,则将所述第二标志位的取值修改为所述第十四预设值,并返回步骤①;
[0055] ⑤、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的高字节,根据所述高字节设置第三计数器的计数值,将所述第二标志位的取值修改为所述第十五预设值,并返回步骤①;
[0056] ⑥、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的低字节,根据所述低字节更新所述第三计数器的计数值,将所述第二标志位的取值修改为所述第十六预设值,并返回步骤①;
[0057] ⑦、所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,根据所述双字节索引数组元素获取第二常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第二常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第二常量池索引,将所述第三计数器的计数值减1,判断所述第三计数器的计数值是否等于0,如果所述第三计数器的计数值不等于0,则返回步骤①;如果所述第三计数器的计数值等于0,则确定对所述位置引用组件处理完毕。
[0058] 6、如权利要求5所述的方法,其特征在于,所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,包括:
[0059] 所述智能卡从所述位置引用组件数据中获取单字节索引数组中的未处理的当前操作数据,判断所述单字节索引数组中的所述当前操作数据是否小于255,如果所述单字节索引数组中的所述当前操作数据不小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与255之和,并返回步骤①;如果所述单字节索引数组中的所述当前操作数据小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与所述单字节索引数组中的所述当前操作数之和,将所述第四计数器的计数值作为所述未处理的单字节索引数组元素;
[0060] 所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,包括:
[0061] 所述智能卡从所述位置引用组件数据中获取双字节索引数组中的未处理的当前操作数据,判断所述双字节索引数组中的所述当前操作数据是否小于255,如果所述双字节索引数组中的所述当前操作数据不小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与255之和,并返回步骤①;如果所述双字节索引数组中的所述当前操作数据小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与所述双字节索引数组中的所述当前操作数之和,将所述第五计数器的计数值作为所述未处理的双字节索引数组元素。
[0062] 7、一种智能卡处理CAP文件的方法,其特征在于,包括以下步骤:
[0063] A、智能卡与外部终端建立连接,并进行初始化;
[0064] B、所述智能卡接收CAP文件对应的应用程序数据协议单元APDU命令,将所述APDU命令包含的数据存储到通信缓冲区;
[0065] C、所述智能卡对所述APDU命令中的状态参数进行判断,如果所述状态参数的取值为第一预设值,则执行步骤D;如果所述状态参数的取值为第二预设值,则执行步骤E;如果所述状态参数的取值为第三预设值,则执行步骤F;如果所述状态参数的取值为第四预设值,则执行步骤G;如果所述状态参数的取值为第五预设值,则执行步骤H;如果所述状态参数的取值为第六预设值,则执行步骤I;如果所述状态参数的取值为第七预设值,则执行步骤J;如果所述状态参数的取值为第八预设值,则执行步骤K;如果所述状态参数的取值为第九预设值,则执行步骤L;如果所述状态参数的取值为第十预设值,则执行步骤M;
[0066] D、所述智能卡从所述通信缓冲区读取头组件数据;当所述智能卡读取且未处理的头组件数据的大小与所述智能卡读取到的头组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的头组件数据进行处理;当所述智能卡未读取完头组件包含的所有头组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述头组件包含的所有头组件数据均处理完毕后,返回步骤B;
[0067] E、所述智能卡从所述通信缓冲区读取目录组件数据;当所述智能卡读取且未处理的目录组件数据的大小与所述智能卡读取到的目录组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的目录组件数据进行处理;当所述智能卡未读取完目录组件包含的所有目录组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述目录组件包含的所有目录组件数据均处理完毕后,返回步骤B;
[0068] F、所述智能卡从所述通信缓冲区读取应用组件数据;当所述智能卡读取且未处理的应用组件数据的大小与所述智能卡读取到的应用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的应用组件数据进行处理;当所述智能卡未读取完应用组件包含的所有应用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述应用组件包含的所有应用组件数据均处理完毕后,返回步骤B;
[0069] G、所述智能卡从所述通信缓冲区读取导入组件数据;当所述智能卡读取且未处理的导入组件数据的大小与所述智能卡读取到的导入组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的导入组件数据进行处理;当所述智能卡未读取完导入组件包含的所有导入组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述导入组件包含的所有导入组件数据均处理完毕后,返回步骤B;
[0070] H、所述智能卡从所述通信缓冲区读取类组件数据;当所述智能卡未读取完类组件包含的所有类组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述类组件包含的所有类组件数据时,所述智能卡处理所述类组件,并返回步骤B;
[0071] I、所述智能卡从所述通信缓冲区读取方法组件数据;当所述智能卡未读取完方法组件包含的所有方法组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述方法组件包含的所有方法组件数据时,所述智能卡处理所述方法组件,并返回步骤B;
[0072] J、所述智能卡从所述通信缓冲区读取静态域组件数据;当所述智能卡读取且未处理的静态域组件数据的大小与所述智能卡读取到的静态域组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的静态域组件数据进行处理;当所述智能卡未读取完静态域组件包含的所有静态域组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述静态域组件包含的所有静态域组件数据均处理完毕后,返回步骤B;
[0073] K、所述智能卡从所述通信缓冲区读取导出组件数据;当所述智能卡未读取完导出组件包含的所有导出组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述导出组件包含的所有导出组件数据时,所述智能卡处理所述导出组件,并返回步骤B;
[0074] L、所述智能卡从所述通信缓冲区读取常量池组件数据;当所述智能卡未读取完常量池组件包含的所有常量池组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡读取完所述常量池组件包含的所有常量池组件数据时,所述智能卡处理所述常量池组件,并返回步骤B;
[0075] M、所述智能卡从所述通信缓冲区读取位置引用组件数据;当所述智能卡读取且未处理的位置引用组件数据的大小与所述智能卡读取到的位置引用组件数据所包含的数据大小信息匹配时,所述智能卡对所述未处理的位置引用组件数据进行处理;当所述智能卡未读取完位置引用组件包含的所有位置引用组件数据,且所述通信缓冲区不存在未被读取的数据时,返回步骤B;当所述智能卡对所述位置引用组件包含的所有位置引用组件数据均处理完毕后,结束流程。
[0076] 8、如权利要求7所述的方法,其特征在于,所述智能卡处理所述常量池组件之前,还包括:
[0077] 所述智能卡从所述目录组件中获取所述常量池组件的大小信息,判断所述常量池组件的大小是否大于随机存储器的可用存储空间,如果大于所述可用存储空间,则根据所述常量池组件的大小信息在非易失存储器为所述常量池组件分配存储空间;如果不大于所述可用存储空间,则根据所述常量池组件的大小信息在所述随机存储器为所述常量池组件分配存储空间;
[0078] 所述智能卡处理所述常量池组件,包括:
[0079] 所述智能卡将所述常量池组件存储到所述常量池组件分配的存储空间中;
[0080] 所述智能卡更新所述常量池组件中的常量池表项数组元素。
[0081] 9、如权利要求8所述的方法,其特征在于,所述智能卡更新所述常量池组件中的常量池表项数组元素之前,还包括:
[0082] 所述智能卡从所述常量池组件中获取所述常量池表项数组的元素个数,将第一计数器的计数值设置为所述常量池表项数组的元素个数;
[0083] 所述智能卡更新所述常量池组件中的常量池表项数组元素,包括:
[0084] 步骤a、所述智能卡从所述常量池组件中获取一个未解析的常量池表项数组元素,根据获取的当前元素的标签判断所述当前元素的类型,如果所述当前元素的类型为类引用,则执行步骤b;如果所述当前元素的类型为实例引用,则执行步骤c;如果所述当前元素的类型为父类方法引用,则执行步骤d;如果所述当前元素的类型为虚拟方法引用,则执行步骤f;如果所述当前元素的类型为静态域引用,则执行步骤j;如果所述当前元素的类型为静态方法引用,则执行步骤k;
[0085] 步骤b、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类标识,根据所述导入包类标识获取导入包类虚拟机标识,使用所述导入包类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0086] 如果所述最高位不为1,则根据所述当前元素获取包内类标识,根据所述包内类标识获取包内类虚拟机标识,使用所述包内类虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0087] 步骤c、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包类标识,根据所述导入包类标识获取导入包类虚拟机标识,根据所述导入包类虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取导入包类引用标识,根据所述导入包类引用标识获取导入包类实例的大小信息,使用所述导入包类实例大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0088] 如果所述最高位不为1,则根据所述当前元素获取包内类实例标识,根据所述包内类实例标识获取包内类实例虚拟机标识,根据所述包内类实例虚拟机标识获取引用表索引数组元素,根据所述引用表索引数组元素获取包内类实例引用标识,根据所述包内类实例引用标识获取包内类实例引用的大小信息,使用所述包内类实例引用的大小信息替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0089] 步骤d、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位不为1,则执行步骤e;如果所述最高位为1,则执行步骤f;
[0090] 步骤e、所述智能卡根据所述当前元素获取包内父类标识,根据所述包内父类标识获取包内父类虚拟机标识,根据所述包内父类虚拟机标识获取包内父类方法标识,根据所述包内父类方法标识获取包内父类方法虚拟机标识,使用所述包内父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0091] 步骤f、所述智能卡根据所述当前元素获取导入包标识以及方法标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取当前导入包父类标识;
[0092] 步骤g、所述智能卡根据所述当前导入包父类标识获取所述导入包父类虚拟机标识,根据所述导入包父类虚拟机标识获取方法表,根据所述方法表获取方法表基数,判断所述方法表基数是否小于等于所述方法标识,如果所述方法表基数小于所述方法标识,则执行步骤h;如果所述方法表基数大于所述方法标识,则执行步骤i;
[0093] 步骤h、所述智能卡从所述方法表中获取导入包父类方法虚拟机标识,使用所述导入包父类方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0094] 步骤i、所述智能卡根据所述当前导入包父类标识获取对应的导入包父类,从所述导入包父类中获取所述导入包父类的父类的标识,判断所述导入包父类的父类的标识是否为非法标识,如果所述导入包父类的父类的标识为所述非法标识,则返回步骤m;如果所述导入包父类的父类的标识不是所述非法标识,则使用所述导入包父类的父类的标识替换所述当前导入包父类标识,并返回步骤g;
[0095] 步骤j、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态域标识,根据所述导入包静态域标识获取导入包静态域虚拟机标识,使用所述导入包静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0096] 如果所述最高位不为1,则根据所述当前元素获取包内静态域标识,根据所述包内静态域标识获取包内静态域虚拟机标识,使用所述包内静态域虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0097] 步骤k、所述智能卡判断所述当前元素的最高位是否为1,如果所述最高位为1,则根据所述当前元素获取导入包标识,根据所述导入包标识获取导入包序号,根据所述导入包序号获取导入包静态方法标识,根据所述导入包静态方法标识获取导入包静态方法虚拟机标识,使用所述导入包静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0098] 如果所述最高位不为1,则根据所述当前元素获取包内静态方法标识,根据所述包内静态方法标识获取包内静态方法虚拟机标识,使用所述包内静态方法虚拟机标识替换所述常量池表项数组中的所述当前元素,并执行步骤m;
[0099] 步骤m、所述智能卡将所述第一计数器的计数值减1,判断所述第一计数器的计数值是否为零,如果所述计数值为零,则清空所述常量池组件中除所述常量池表项数组外的内容占用的存储空间;如果所述计数值不为零,则返回步骤a。
[0100] 10、如权利要求7所述的方法,其特征在于,所述智能卡处理所述位置引用组件数据,包括:
[0101] 所述智能卡根据所述位置引用组件数据,获取常量池索引在所述方法组件中的偏移地址;
[0102] 所述智能卡根据所述偏移地址获取所述常量池索引,根据所述常量池索引获取对应的常量池表项数组的内容;
[0103] 所述智能卡使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述常量池索引。
[0104] 11、如权利要求10所述的方法,其特征在于,所述常量池索引包括第一常量池索引和第二常量池索引;
[0105] 所述智能卡处理所述位置引用组件数据,包括:
[0106] ①、所述智能卡对第二状态标志位的取值进行判断,如果所述第二状态标志位的取值为第十一预设值时,则执行步骤②;如果所述第二状态标志位的取值为第十二预设值时,则执行步骤③;如果所述第二状态标志位的取值为第十三预设值时,执行步骤④;如果所述第二状态标志位的取值为第十四预设值时,执行步骤⑤;如果所述第二状态标志位的取值为第十五预设值时,执行步骤⑥;如果所述第二状态标志位的取值为第十六预设值时,执行步骤⑦;
[0107] ②、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的高字节,根据所述高字节设置第二计数器的计数值,将所述第二标志位的取值修改为所述第十二预设值,并返回步骤①;
[0108] ③、所述智能卡从所述位置引用组件数据中获取单字节索引数组的元素个数的低字节,根据所述低字节更新所述第二计数器的计数值,将所述第二标志位的取值修改为所述第十三预设值,并返回步骤①;
[0109] ④、所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,根据所述单字节索引数组元素获取第一常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第一常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第一常量池索引,将所述第二计数器的计数值减1,判断所述第二计数器的计数值是否等于0,如果所述第二计数器的计数值不等于0,则返回步骤①;如果所述第二计数器的计数值等于0,则将所述第二标志位的取值修改为所述第十四预设值,并返回步骤①;
[0110] ⑤、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的高字节,根据所述高字节设置第三计数器的计数值,将所述第二标志位的取值修改为所述第十五预设值,并返回步骤①;
[0111] ⑥、所述智能卡从所述位置引用组件数据中获取双字节索引数组的元素个数的低字节,根据所述低字节更新所述第三计数器的计数值,将所述第二标志位的取值修改为所述第十六预设值,并返回步骤①;
[0112] ⑦、所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,根据所述双字节索引数组元素获取第二常量池索引在所述方法组件内的偏移地址,根据所述偏移地址指向的地址存储的所述第二常量池索引,获取对应的常量池表项数组的内容,使用获取到的所述常量池表项数组的内容替换所述偏移地址指向的地址存储的所述第二常量池索引,将所述第三计数器的计数值减1,判断所述第三计数器的计数值是否等于0,如果所述第三计数器的计数值不等于0,则返回步骤①;如果所述第三计数器的计数值等于0,则确定对所述位置引用组件处理完毕。
[0113] 12、如权利要求11所述的方法,其特征在于,所述智能卡从所述位置引用组件数据中获取一个未处理的单字节索引数组元素,包括:
[0114] 所述智能卡从所述位置引用组件数据中获取单字节索引数组中的未处理的当前操作数据,判断所述单字节索引数组中的所述当前操作数据是否小于255,如果所述单字节索引数组中的所述当前操作数据不小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与255之和,并返回步骤①;如果所述单字节索引数组中的所述当前操作数据小于255,则将第四计数器的计数值更新为所述第四计数器的当前计数值与所述单字节索引数组中的所述当前操作数之和,将所述第四计数器的计数值作为所述未处理的单字节索引数组元素;
[0115] 所述智能卡从所述位置引用组件数据中获取一个未处理的双字节索引数组元素,包括:
[0116] 所述智能卡从所述位置引用组件数据中获取双字节索引数组中的未处理的当前操作数据,判断所述双字节索引数组中的所述当前操作数据是否小于255,如果所述双字节索引数组中的所述当前操作数据不小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与255之和,并返回步骤①;如果所述双字节索引数组中的所述当前操作数据小于255,则将第五计数器的计数值更新为所述第五计数器的当前计数值与所述双字节索引数组中的所述当前操作数之和,将所述第五计数器的计数值作为所述未处理的双字节索引数组元素。
[0117] 本发明的有益效果为:通过本发明提供的一种智能卡处理CAP文件的方法,能够有效的利用智能卡存储资源,提高CAP文件的下载速度和保证下载过程中CAP文件及智能卡中内容的完整性。

附图说明

[0118] 图1为本发明实施例1提供的一种智能卡处理CAP文件的方法流程图;
[0119] 图2为本发明实施例1提供的一种处理头组件数据的方法流程图;
[0120] 图3为本发明实施例1提供的一种处理类组件数据的方法流程图;
[0121] 图4为本发明实施例2提供的另一种智能卡处理CAP文件的方法流程图;
[0122] 图5为本发明实施例2提供的另一种处理头组件数据的方法流程图;
[0123] 图6为本发明实施2提供的另一种处理类组件数据的方法流程图;
[0124] 图7为本发明实施例3提供的一种智能卡下载并解析常量池组件的方法流程图;
[0125] 图8为本发明实施例4提供的一种智能卡下载并解析位置引用组件的方法流程图。

具体实施方式

[0126] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0127] 为了能够有效的利用智能卡系统中存储资源,提高CAP文件的下载速度,本发明提供了一种智能卡处理CAP文件的方法。CAP文件由12个组件组成,具体为:头组件、目录组件、应用组件、导入组件、类组件、方法组件、静态域组件、导出组件、常量池组件、位置引用组件、描述符组件、调试组件。
[0128] 实施例1
[0129] 本发明实施例1提供了一种智能卡处理CAP文件的方法;下面结合图1对所述方法进行介绍,具体步骤如下:
[0130] 步骤101:智能卡与外部终端建立连接,并进行初始化;
[0131] 优选地,在本实施例中,所述智能卡进行初始化后第一状态标志位为0;
[0132] 步骤102:所述智能卡接收CAP文件对应的应用程序数据协议单元APDU命令,将所述APDU命令包含的数据存储到通信缓冲区;
[0133] 步骤103:所述智能卡判断第一状态标志位的取值,当所述第一状态标志位的取值为第一预设值,则执行步骤104;当所述第一状态标志位的取值为第二预设值,则执行步骤105;当所述第一状态标志位的取值为第三预设值,则执行步骤106;当所述第一状态标志位的取值为第四预设值,则执行步骤107;当所述第一状态标志位的取值为第五预设值,则执行步骤108;当所述第一状态标志位的取值为第六预设值,则执行步骤109;当所述第一状态标志位的取值为第七预设值,则执行步骤110;当所述第一状态标志位的取值为第八预设值,则执行步骤111;当所述第一状态标志位的取值为第九预设值,则执行步骤112;当所述第一状态标志位的取值为第十预设值,则执行步骤113;
[0134] 优选地,在本实施例中,所述第一状态标志位的第一预设值为0;所述第一状态标志位的第二预设值为1;所述第一状态标志位的第三预设值为2;所述第一状态标志位的第四预设值为3;所述第一状态标志位的第五预设值为4;所述第一状态标志位的第六预设值为5;所述第一状态标志位的第七预设值为6;所述第一状态标志位的第八预设值为7;所述第一状态标志位的第九预设值为8;所述第一状态标志位的第十预设值为9;
[0135] 步骤104:所述智能卡从通信缓冲区读取头组件数据并对头组件数据进行处理,下面结合图2对头组件数据处理方法进行介绍,具体步骤如下:
[0136] 步骤11-1:所述智能卡从所述通信缓冲区读取头组件数据,并根据头组件数据中的第一字节长度设置第一计数器;
[0137] 在本实施例中,在CAP文件中组件数据采用TLV格式,TLV格式是一种长度可变格式,组件数据的TLV格式如表1所示:
[0138]T L1 L2 V ………… L2 V L2 V
[0139] 表1
[0140] 包括:标签(tag)、字节长度(length)、实际数据内容(value);标签表示当前组件数据的类型,字节数是固定不变的;字节长度用于表示实际数据内容的长度,包括第一字节长度和第二字节长度,如上表1所示所述第一字节长度L1表示整个组件数据所包含的数据大小信息,所述第二字节长度L2表示当前读取的组件数据所包含的数据大小信息,所述字节长度的字节数也是固定不变的;所述实际数据内容根据字节长度的值确定字节数;所述第一计数器用于计量整个头组件所包含的数据大小信息;
[0141] 步骤11-2:所述智能卡根据当前读取的头组件数据中的第二字节长度设置第二计数器;
[0142] 在本实施例中,所述第二计数器用于计量当前读取的头组件数据所包含的数据大小信息;
[0143] 步骤11-3:所述智能卡判断所述智能卡读取且未处理的头组件数据的大小与第二计数器的计数是否匹配;是,则执行步骤11-4;否则执行步骤11-5;
[0144] 步骤11-4:所述智能卡对未处理的头组件数据的内容进行处理,并根据所处理头组件数据的字节数对第一计数器和第二计数器进行相应的减操作,并判断第一计数器的值是否为0,是则执行步骤11-6;否则执行步骤11-5;
[0145] 在本实施例中,第二计数器为0时,确定当前读取的头组件数据处理完毕;第一计数器的计数为0时,确定对头组件数据处理完毕;
[0146] 具体地,所述头组件数据可以包含的内容为:包应用标识符、包版本号,也可以进一步包含包名;处理所述头组件数据的内容的具体操作步骤如下:
[0147] A-1:所述智能卡从头组件中获取包应用标识符并创建包应用标识符对象;
[0148] A-2:所述智能卡判断所述头组件中是否存在包名,是则执行步骤A-3;否则执行步骤A-4;
[0149] A-3:所述智能卡根据所述包名创建包名对象,生成包名对象引用;所述智能卡创建包信息类并将所述包应用标识符对象、所述包版本号、包名对象引用写入所述包信息类;
[0150] 在本实施例中,所述智能卡在创建所述包名对象时产生所述包名对象引用;
[0151] A-4:所述智能卡创建包信息类并将所述包应用标识符对象、所述包版本号写入所述包信息类;
[0152] 步骤11-5:所述智能卡判断所述通信缓冲区是否存在未被读取的头组件数据;是,则返回步骤11-1;否,则执行步骤102;
[0153] 步骤11-6:所述智能卡将第一状态标志位的取值修改为第二预设值;
[0154] 步骤11-7:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,是,则执行步骤103;否,则执行步骤102;
[0155] 步骤105:所述智能卡从通信缓冲区读取目录组件数据并进行处理,处理过程与图2头组件数据处理过程类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0156] 步骤12-1:所述智能卡从所述通信缓冲区读取目录组件数据,并根据目录组件数据中的第一字节长度设置第一计数器;
[0157] 在本实施例中,所述第一计数器用于计量整个目录组件所包含的数据大小信息;
[0158] 步骤12-2:所述智能卡根据当前读取的目录组件数据中的第二字节长度设置第二计数器;
[0159] 在本实施例中,所述第二计数器用于计量当前读取的目录组件数据所包含的数据大小信息;
[0160] 步骤12-3:所述智能卡判断所述智能卡读取且未处理的目录组件数据的大小与第二计数器的计数是否匹配;是则执行步骤12-4;否则执行步骤12-5;
[0161] 步骤12-4:所述智能卡对未处理的目录组件数据的内容进行处理,并根据所处理目录组件数据的字节数对第一计数器和第二计数器进行相应的减操作,并判断第一计数器的值是否为0,是则执行步骤12-6;否则执行步骤12-5;
[0162] 在本实施例中,第二计数器为0时,确定当前读取的目录组件数据处理完毕;第一计数器的计数为0时,确定对目录组件数据处理完毕。
[0163] 具体地,处理所述目录组件数据的内容的具体操作步骤如下:
[0164] 步骤B-1:所述智能卡根据目录组件中12个组件的大小信息并创建目录数组;
[0165] 步骤B-2:所述智能卡将至少10个组件的大小信息存储至所述目录数组中;
[0166] 在本实施例中,所述智能卡将头组件、目录组件、应用组件、导入组件、类组件、方法组件、静态域组件、导出组件、常量池组件、位置引用组件的大小信息存储至目录数组中,也可以进一步存储描述符组件和调试组件;
[0167] 步骤12-5:所述智能卡判断所述通信缓冲区是否存在未读取的目录组件数据;若存在,则从所述通信缓冲区继续读取目录组件数据,并返回步骤12-2;若不存在,则执行步骤102;
[0168] 步骤12-6:所述智能卡将第一状态标志位的取值修改为第三预设值;
[0169] 步骤12-7:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0170] 步骤106:所述智能卡从通信缓冲区读取应用组件数据并进行处理,处理过程与图2头组件数据处理过程类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0171] 步骤13-1:所述智能卡从所述通信缓冲区读取应用组件数据,并根据应用组件数据中的第一字节长度设置第一计数器;
[0172] 在本实施例中,所述第一计数器用于计量整个应用组件所包含的数据大小信息;
[0173] 步骤13-2:所述智能卡根据当前读取的应用组件数据中的第二字节长度设置第二计数器;
[0174] 在本实施例中,所述第二计数器用于计量当前读取的应用组件数据所包含的数据大小信息;
[0175] 步骤13-3:所述智能卡判断所述智能卡读取且未处理的目录组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤13-4;否则执行步骤13-5;
[0176] 步骤13-4:所述智能卡对未处理的应用组件数据的内容进行处理,并根据所处理应用组件数据的字节数对第一计数器和第二计数器进行相应的减操作,并判断第一计数器的值是否为0,是则执行步骤13-6;否则执行步骤13-5;
[0177] 在本实施例中,第二计数器为0时,确定当前读取的应用组件数据处理完毕;第一计数器的计数为0时,确定对应用组件数据处理完毕。
[0178] 具体地,在本实施例中,所述应用组件中包含应用类数量和应用组件的应用标识符,处理所述应用组件的具体操作步骤如下:
[0179] C-1:所述智能卡从应用组件中获取应用类数量和应用组件的应用标识符,并根据应用组件的应用标识符创建应用组件的应用标识符对象,生成应用标识符对象引用[0180] C-2:所述智能卡将应用标识符对象引用写入所述包信息类;
[0181] 步骤13-5:所述智能卡判断所述通信缓冲区是否存在未读取的应用组件数据;若存在,则从所述通信缓冲区继续读取应用组件数据,并返回步骤13-2;若不存在,则执行步骤102;
[0182] 步骤13-6:所述智能卡将第一状态标志位的取值修改为第四预设值;
[0183] 步骤13-7:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0184] 步骤107:所述智能卡从通信缓冲区读取导入组件数据并进行处理,处理过程与图2头组件数据处理过程类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0185] 步骤14-1:所述智能卡从所述通信缓冲区读取导入组件数据,并根据导入组件数据中的第一字节长度设置第一计数器;
[0186] 在本实施例中,所述第一计数器用于计量整个导入组件所包含的数据大小信息;
[0187] 步骤14-2:所述智能卡根据当前读取的导入组件数据中的第二字节长度设置第二计数器;
[0188] 在本实施例中,所述第二计数器用于计量当前读取的导入组件数据所包含的数据大小信息;
[0189] 步骤14-3:所述智能卡判断所述智能卡读取且未处理的导入组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤14-4;否则执行步骤14-5;
[0190] 步骤14-4:所述智能卡对未处理的导入组件数据的内容进行处理,并根据所处理导入组件数据的字节数对第一计数器和第二计数器进行相应的减操作,并判断第一计数器的值是否为0,是则执行步骤14-6;否则执行步骤14-5;
[0191] 在本实施例中,第二计数器为0时,确定当前读取的导入组件数据处理完毕;第一计数器的计数为0时,确定对导入组件数据处理完毕。
[0192] 具体地,处理所述导入组件的具体操作步骤如下:
[0193] D-1:所述智能卡从导入组件中获取导入包的相关信息;
[0194] 在本实施例中,所述导入组件包括多个导入包的相关信息,所述导入包的相关信息可以包含:导入包应用标识符、导入包序号,也可以进一步包含导入包包名;每个导入包标识对应一个导入包序号,每个导入包序号对应一个导入包;
[0195] D-2:所述智能卡创建导入数组;
[0196] D-3:所述智能卡从未解析的导入包的相关信息中获取导入包序号并存储至所述导入数组;
[0197] D-4:所述智能卡判断是否存在未解析的导入包的相关信息,是则返回步骤D-3;否则确定对导入组件处理完毕;
[0198] 步骤14-5:所述智能卡判断所述通信缓冲区是否存在未读取的导入组件数据;若存在,则从所述通信缓冲区继续读取导入组件数据,并返回步骤14-2;若不存在,则执行步骤102;
[0199] 步骤14-6:所述智能卡将第一状态标志位的取值修改为第四预设值;
[0200] 步骤14-7:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0201] 步骤108:所述智能卡从通信缓冲区读取类组件数据并进行处理,下面结合图3对类组件数据的处理方法进行介绍,具体步骤如下:
[0202] 步骤15-1:所述智能卡从所述目录数组中获取类组件的大小信息,根据类组件的大小为所述类组件分配第一存储地址段,并从所述通信缓冲区读取类组件数据,将类组件数据存储至所述第一存储地址段;
[0203] 步骤15-2:所述智能卡判断是否读取完所述类组件包含的类组件数据,是则执行步骤15-3;否则返回步骤102;
[0204] 本实施例中,所述第一存储地址段存满表示所述类组件包含的类组件数据已读取完毕;所述类组件是程序执行的核心,包含CAP文件的所有接口信息和类信息,所述接口信息和类信息统称为类组件单元信息;
[0205] 步骤15-3:智能卡对类组件进行处理,确定类组件处理完毕,所述智能卡将第一状态标志位的取值修改为第六预设值;
[0206] 具体地,所述类组件的具体步骤如下:
[0207] E-1:所述智能卡通过类组件单元信息标识位判断所述类组件单元信息是否为接口信息,是则执行步骤E-2;否则执行步骤E-3;
[0208] 优选地,在本实施例中,所述类组件单元信息标识位为1时表示所述类组件单元信息为所述接口信息,所述类组件单元信息标识位为0时表示所述类组件单元信息为所述类信息;
[0209] E-2:所述智能卡处理所述接口信息;
[0210] E-3:所述智能卡处理所述类信息;
[0211] 步骤15-4:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0212] 步骤109:所述智能卡从通信缓冲区读取方法组件数据并进行处理,方法组件处理过程与类组件处理过程类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0213] 步骤16-1:所述智能卡从所述目录数组中获取方法组件的大小信息,根据方法组件的大小为所述方法组件分配第二存储地址段,并从所述通信缓冲区读取方法组件数据,并将方法组件数据存储至所述第二存储地址段;
[0214] 步骤16-2:所述智能卡判断是否读取完所述方法组件包含的方法组件数据,是则对清空所述方法组件中的异常信息,并执行步骤16-3;否则返回步骤102;
[0215] 本实施例中,所述第一存储地址段存满表示所述方法组件包含的方法组件数据已读取完毕;
[0216] 步骤16-3:所述智能卡将第一状态标志位的取值修改为第七预设值;
[0217] 步骤16-4:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0218] 步骤110:所述智能卡从通信缓冲区读取静态域组件数据并进行处理,处理过程与头组件数据过程类似,区别是组件数据的内容处理不同,具体步骤如下:步骤17-1:所述智能卡从所述通信缓冲区读取静态域组件数据,并根据静态域组件数据中的第一字节长度设置第一计数器;
[0219] 在本实施例中,所述第一计数器用于计量整个静态域组件所包含的数据大小信息;
[0220] 步骤17-2:所述智能卡根据当前读取的静态域组件数据中的第二字节长度设置第二计数器;
[0221] 在本实施例中,所述第二计数器用于计量当前读取的静态域组件数据所包含的数据大小信息;
[0222] 步骤17-3:所述智能卡判断所述智能卡读取且未处理的静态域组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤17-4;否则执行步骤17-5;
[0223] 步骤17-4:所述智能卡对未处理的静态域组件数据的内容进行处理,并根据所处理静态域组件数据的字节数对第一计数器和第二计数器进行相应的减操作,并判断第一计数器的值是否为0,是则执行步骤17-6;否则执行步骤17-5;
[0224] 在本实施例中,第二计数器为0时,确定当前读取的静态域组件数据的内容处理完毕;第一计数器的计数为0时,确定对静态域组件数据处理完毕。
[0225] 具体地,处理静态域组件的内容的具体操作步骤如下:
[0226] G-1:所述智能卡从所述目录组件中获取所述静态域组件的大小信息,并根据所述静态域组件的大小为所述静态域组件分配第三存储地址段;
[0227] G-2:所述智能卡将所述静态域组件存储至所述第三存储地址段;
[0228] G-3:所述智能卡创建静态数组并对所述静态数组进行初始化;
[0229] 优选地,在本实施例中,所述智能卡使用缺省值(0)来初始化静态数组;
[0230] G-4:所述智能卡清除未初始化的静态数组;
[0231] 步骤17-5:所述智能卡判断所述通信缓冲区是否存在未读取的静态域组件数据;若存在,则从所述通信缓冲区继续读取静态域组件数据,并返回步骤13-2;若不存在,则执行步骤102;
[0232] 步骤17-6:所述智能卡将第一状态标志位的取值修改为第八预设值;
[0233] 步骤17-7:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0234] 步骤111:所述智能卡从通信缓冲区读取导出组件数据并进行处理,导出组件处理过程与类组件处理过程类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0235] 步骤18-1:所述智能卡从所述目录数组中获取导出组件的大小信息,根据方法组件的大小为所述导出组件分配第四存储地址段,并从所述通信缓冲区读取导出组件数据,并将导出组件数据存储至所述第四存储地址段;
[0236] 步骤18-2:所述智能卡判断是否读取完所述导出组件包含的导出组件数据,是则对所述导出组件进行处理,并执行步骤18-3;否则返回步骤102;
[0237] 具体地,处理所述导出组件的具体操作步骤如下:
[0238] 所述导出组件包含:类偏移地址、静态域偏移数组、静态方法偏移数组;
[0239] H-1:所述Java为所述类偏移地址分配虚拟机标识;
[0240] H-2:所述智能卡从所述静态域偏移数组中获取静态域的偏移地址,根据所述静态域的偏移地址得到静态域引用,并为所述静态域引用分配虚拟机标识;
[0241] H-3:所述智能卡从静态方法偏移数组中获取静态常量池索引的偏移地址,根据所述静态常量池索引的偏移地址得到静态方法引用,并为所述静态方法引用分配虚拟机标识;
[0242] 步骤18-3:所述智能卡将第一状态标志位的取值修改为第九预设值;
[0243] 步骤18-4:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0244] 步骤112:所述智能卡从通信缓冲区读取常量池组件数据并进行处理,具体处理步骤如下:
[0245] 步骤19-1:所述智能卡从所述目录数组中获取常量池组件的大小信息,并判断是否小于第一存储器的存储空间,是则从所述通信缓冲区读取常量池组件数据并将常量池组件数据存储至第一存储器中;否则从所述通信缓冲区读取常量池组件数据并将所述常量池组件数据存储至第二存储器中;
[0246] 在本实施例中,所述第一存储器为随机存储器,第二存储器为非易失性存储器;
[0247] 步骤19-2:所述智能卡判断是否读取完所述常量池组件包含的常量池组件数据,是则对所述导出组件进行处理,并执行步骤19-3;否则返回步骤102;
[0248] 具体地,处理所述常量池组件的操作步骤为:
[0249] I-1:所述智能卡从所述常量池组件中获取常量池表项数组的元素个数,并将第三计数器的计数值设置为所述常量池表项数组的元素个数;
[0250] 在本实施例中,所述第三计数器用于计量常量池表项数组的元素个数;
[0251] I-2:所述智能卡从常量池组件中获取所述常量池表项数组元素,并根据常量池表项数组当前元素的标签判断所述常量池表项数组当前元素的类型;
[0252] 在本实施例中,所述常量池表项数组的元素类型包括:类引用、实例引用、父类方法引用、静态域引用、静态方法引用;
[0253] 优选地,在本实施例中,所述常量池表项数组当前元素的第一个字节表示所述常量池表项数组当前元素的标签;
[0254] I-3:所述智能卡根据所述常量池表项数组元素的类型执行相应操作,具体见实施例3解析常量池组件的方法,在此不赘述;
[0255] I-4:所述智能卡对第三计数器的计数值执行减1操作;
[0256] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述常量池表项数组中未解析的元素个数;
[0257] I-5:所述智能卡判断第三计数器的计数值是否等于0,是则确定对常量池组件解析完毕;否则返回步骤I-2;
[0258] 步骤19-3:所述智能卡将第一状态标志位的取值修改为第十预设值;
[0259] 步骤19-4:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤103;如果不存在,则执行步骤102;
[0260] 步骤113:所述智能卡从通信缓冲区读取位置引用组件数据并进行处理,具体处理步骤如下:
[0261] 步骤110-1:所述智能卡从所述通信缓冲区中读取位置引用组件的当前操作数据;
[0262] 在本实施例中,所述位置引用的操作数据包含的信息为:单字节索引数组元素个数的高字节、单字节索引数组元素个数的低字节、单字节索引数组的元素、双字节索引数组元素个数的高字节、双字节索引数组元素个数的低字节、双字节索引数组的元素;
[0263] 步骤110-2:所述智能卡处理所述位置引用组件的当前操作数据;
[0264] 具体地,处理所述位置引用组件的当前操作数据的具体操作为判断第二状态标志位的取值并执行相应的操作;
[0265] 在本实施例中,所述第二状态标志位的取值包括:第十一预设值、第十二预设值、第十三预设值、第十四预设值、第十五预设值、第十六预设值;
[0266] 优选地,在本实施例中,第二状态标志位的第十一预设值为0;第二状态标志位的第十二预设值为1;第二状态标志位的第十三预设值为2;第二状态标志位的第十四预设值为3;第二状态标志位的第十五预设值为4;第二状态标志位的第十六预设值为5;
[0267] 当第二状态标志位的取值为第十一预设值,所述智能卡根据位置引用组件得到单字节索引数组元素个数的高字节并进行相应处理;
[0268] 具体地,所述智能卡设置第三计数器并清空位置引用组件的当前操作数据;所述智能卡将第二卡片状态设置为第二状态并返回步骤110-1;
[0269] 优选地,在本实施例中,所述智能卡根据所述单字节索引数组的元素个数的高字节设置第三计数器;
[0270] 当第二状态标志位的取值为第十二预设值,所述智能卡根据当前操作数据得到单字节索引数组元素个数的低字节并进行相应处理;
[0271] 具体地,所述智能卡重置第三计数器并清空位置引用组件的当前操作数据;所述智能卡将第二卡片状态设置为第三状态并返回步骤110-1;
[0272] 优选地,在本实施例中,所述智能卡重置所述第三计数器的具体操作为:所述智能卡将所述第三计数器的计数值左移八位后得到的值与单字节索引数组元素个数的低字节的值相加;
[0273] 当第二状态标志位的取值为第十三预设值,所述智能卡根据位置引用组件得到单字节索引数元素并进行相应处理;
[0274] 所述智能卡处理单字节索引数组元素的具体操作为:
[0275] 00-1:所述智能卡判断所述位置引用组件的当前操作数据的值是否等于255,是则执行步骤00-2;否则执行步骤00-3;
[0276] 在本实施例中,所述操作数据的值的范围为0~255;当所述智能卡处于第三状态时,从位置引用组件中读取单字节索引数组元素,即常量池索引常量池索引在方法组件内的偏移地址;
[0277] 00-2:所述智能卡重置第四计数器并返回步骤110-1;
[0278] 在本实施例中,所述第四计数器用来计量第一常量池索引在方法组件内的偏移地址,所述第四计数器的初始计数值为0;所述智能卡重置所述第四计数器的具体操作为:所述智能卡将第四计数器的当前计数值与255相加;
[0279] 00-3:所述智能卡将第四计数器的计数值设置为第四计数器的当前计数值与当前操作数据值之和,
[0280] 00-4:所述智能卡根据所述第一常量池索引在方法组件内的偏移地址得到第一常量池表项数组的内容;
[0281] 在本实施例中,所述第一常量池索引在方法组件内的偏移地址指向的地址中存储的是第一常量池索引,所述第一常量池索引的地址中存储的是第一常量池表项数组的内容;
[0282] 00-5:所述智能卡用第一常量池表项的内容替换所述第一常量池索引在方法组件内的偏移地址指向的地址中的内容,即所述第一常量池索引的地址;
[0283] 00-6:所述智能卡对所述第三计数器的计数值执行减1操作;
[0284] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述单字节索引数组中未解析的元素个数;
[0285] 00-7:所述智能卡判断所述第三计数器的计数值是否等于0,是则执行步骤00-8;否则返回步骤110-1;
[0286] 00-8:所述智能卡将第二卡片状态设置为第四状态,返回步骤110-1;
[0287] 当第二卡片状态处于第四状态时;所述智能卡根据位置引用组件的当前操作数据得到双字节索引数组元素个数的高字节并进行相应处理;
[0288] 具体地,所述智能卡重置第三计数器并清空位置引用组件的当前操作数据;所述智能卡将第二卡片状态设置为第五状态并返回步骤110-1;
[0289] 优选地,所述智能卡根据所述单字节索引数组长度高字节重置第三计数器;
[0290] 当第二卡片状态处于第五状态时,所述智能卡根据当操作数据得到双字节索引数组元素个数的低字节并进行相应处理;
[0291] 具体地,所述智能卡重置第三计数器并清空位置引用组件的当前操作数据;所述智能卡将第二卡片状态设置为第六状态并返回步骤110-1;
[0292] 当第二卡片状态处于第六状态时,所述智能卡根据当前操作数据得到双字节索引数组元素并进行相应处理;
[0293] 所述智能卡执行的相应操作具体为:
[0294] 01-1:所述智能卡判断位置引用组件的当前操作数据的值是否等于255,是则执行步骤01-2;否则执行步骤01-3;
[0295] 在本实施例中,所述操作数据的值的范围为0~255;当所述智能卡处于第六状态时,从位置引用组件中双字节索引数组元素,即第二常量池索引在方法组件内的偏移地址;
[0296] 01-2:所述智能卡重置第四计数器并返回步骤110-1;
[0297] 在本实施例中,所述第四计数器用来计量第二常量池索引在方法组件内的偏移地址;所述智能卡重置第四计数器的具体操作为:所述智能卡将第四计数器的当前计数值与255相加;
[0298] 01-3:所述智能卡将第四计数器的计数值设置为第四计数器的当前计数值与位置引用组件的当前操作数据值之和,
[0299] 01-4:所述智能卡根据所述第二常量池索引在方法组件内的偏移地址得到第二常量池索引的内容;
[0300] 在本实施例中,所述第二常量池索引在方法组件内的偏移地址指向的地址中存储的是第二常量池索引地址,所述第二常量池索引的地址中存储的是第二常量池表项的内容;
[0301] 01-5:所述智能卡用所述第二常量池表项的内容替换所述第二常量池索引在组件内的偏移地址指向的地址中的内容;
[0302] 01-6:所述智能卡对所述第三计数器的计数值执行减1操作;
[0303] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述双字节索引数组中未解析的元素个数;
[0304] 01-7:所述智能卡判断所述第三计数器的计数值是否等于0,是则确定完成位置引用组件下载解析过程;否则返回执行步骤110-1。
[0305] 优选地,在本实施例中,还可在处理组件数据后清空当前组件数据。
[0306] 实施例2
[0307] 本发明实施例2提供了另一种智能卡处理CAP文件的方法,下面结合图4对所述方法进行介绍,具体步骤如下:
[0308] 步骤401:智能卡与外部中断建立连接,并进行初始化;
[0309] 步骤402:所述智能卡接收CAP文件对应的应用程序数据协议单元APDU命令,将所述APDU命令包含的数据存储到通信缓冲区;
[0310] 步骤403:所述智能卡对所述APDU命令中的状态参数进行判断,如果所述状态参数的取值为第一预设值,则执行步骤404;如果所述状态参数的取值为第二预设值,则执行步骤405;如果所述状态参数的取值为第三预设值,则执行步骤406;如果所述状态参数的取值为第四预设值,则执行步骤407;如果所述状态参数的取值为第五预设值,则执行步骤408;如果所述状态参数的取值为第六预设值,则执行步骤409;如果所述状态参数的取值为第七预设值,则执行步骤410;如果所述状态参数的取值为第八预设值,则执行步骤411;
如果所述状态参数的取值为第九预设值,则执行步骤412;如果所述状态参数的取值为第十预设值,则执行步骤413;
[0311] 优选地,在本实施例中,所述状态参数的第一预设值为0;所述状态参数的第二预设值为1;所述状态参数的第三预设值为2;所述状态参数的第四预设值为3;所述状态参数的第五预设值为4;所述状态参数的第六预设值为5;所述状态参数的第七预设值为6;所述状态参数的第八预设值为7;所述状态参数的第九预设值为8;所述状态参数的第十预设值为9;
[0312] 步骤404:所述智能卡从通信缓冲区读取头组件数据并进行处理,下面结合图5对头组件数据的处理方法进行介绍,具体步骤如下:
[0313] 步骤41-1:所述智能卡从所述通信缓冲区读取头组件数据,并根据当前读取的头组件数据中的第二字节长度设置第二计数器;
[0314] 在本实施例中,CAP文件中组件数据通过外部转化器被转换为符合ISO7816-3的应用程序数据协议单元APDU命令,并采用另一种TLV格式,ADPU命令的另一种TLV格式如表2所示:
[0315]T1 L V ……… L V T2
[0316] 表2
[0317] 包括:开始标签(tag1)、字节长度(length)、实际数据内容(value)、结束标签(tag2);开始标签表示当前组件数据的类型,通过参数P1的值确定当前组件数据的类型,字节数是固定不变的;字节长度表示当前读取的组件数据所包含的数据大小信息,所述字节长度的字节数也是固定不变的;实际数据内容的字节数是可变的;结束标签表示确定当前类型的组件数据传输完毕。所述头组件数据可以包含的内容为:包应用标识符、包版本号,也可以进一步包含包名;所述第二计数器用于计量当前读取的头组件数据所包含的数据大小信息;
[0318] 步骤41-2:所述智能卡判断所述智能卡读取且未处理的头组件数据的大小与第二计数器的计数是否匹配;是,则执行步骤41-3;否则执行步骤41-4;
[0319] 步骤41-3:所述智能卡对未处理的头组件数据的内容进行处理,并根据所处理头组件数据的字节数对第二计数器进行相应的减操作;
[0320] 在本实施例中,第二计数器为0时,确定当前读取的头组件数据的内容处理完毕;
[0321] 具体地,处理所述头组件数据的内容的具体操作步骤如下:
[0322] A-1:所述智能卡从头组件中获取包应用标识符并创建包应用标识符对象;
[0323] A-2:所述智能卡判断所述头组件中是否存在包名,是则执行步骤A-3;否则执行步骤A-4;
[0324] A-3:所述智能卡根据所述包名创建包名对象,生成包名对象引用;所述智能卡创建包信息类并将所述包应用标识符对象、所述包版本号、包名对象引用写入所述包信息类;
[0325] 在本实施例中,所述智能卡在创建所述包名对象时产生所述包名对象引用;
[0326] A-4:所述智能卡创建包信息类并将所述包应用标识符对象、所述包版本号写入所述包信息类;
[0327] 步骤41-4:所述智能卡判断是否读取到头组件结束标签,是则执行步骤41-6;否则执行步骤41-5;
[0328] 步骤41-5:所述智能卡判断所述通信缓冲区是否存在未读取的头组件数据;若存在,则返回步骤41-1;若不存在,则执行步骤402;
[0329] 步骤41-6:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0330] 步骤405:所述智能卡从所述通信缓冲区读取目录组件数据并进行处理,处理过程与步骤404类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0331] 步骤42-1:所述智能卡从所述通信缓冲区读取目录组件数据,并根据当前读取的目录组件数据中的第二字节长度设置第二计数器;
[0332] 在本实施例中,所述第二计数器用于计量当前读取的目录组件数据所包含的数据大小信息;
[0333] 步骤42-2:所述智能卡判断所述智能卡读取且未处理的目录组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤42-3;否则执行步骤42-4;
[0334] 步骤42-3:所述智能卡对未处理的目录组件数据的内容进行处理,并根据所处理目录组件数据的字节数对第二计数器进行相应的减操作;
[0335] 在本实施例中,第二计数器为0时,确定当前读取的目录组件数据的内容处理完毕;
[0336] 具体地,处理所述目录组件数据的内容的具体操作步骤如下:
[0337] 步骤B-1:所述智能卡根据目录组件中12个组件的大小信息并创建目录数组;
[0338] 步骤B-2:所述智能卡将至少10个组件的大小信息存储至所述目录数组中;
[0339] 在本实施例中,所述智能卡将头组件、目录组件、应用组件、导入组件、类组件、方法组件、静态域组件、导出组件、常量池组件、位置引用组件的大小信息存储至目录数组中,也可以进一步存储描述符组件和调试组件;
[0340] 步骤42-4:所述智能卡判断是否读取到目录组件数据结束标签,是则执行步骤42-6;否则执行步骤42-5;
[0341] 步骤42-5:所述智能卡判断所述通信缓冲区是否存在未读取的目录组件数据;若存在,则从所述通信缓冲区继续读取头组件数据,并返回步骤42-2;若不存在,则执行步骤402;
[0342] 步骤42-6:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0343] 步骤406:所述智能卡从所述通信缓冲区读取应用组件数据并进行处理,处理过程与404类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0344] 步骤43-1:所述智能卡从所述通信缓冲区读取应用组件数据,并根据当前读取的应用组件数据中的第二字节长度设置第二计数器;
[0345] 在本实施例中,所述第二计数器用于计量当前读取的应用组件数据所包含的数据大小信息;
[0346] 步骤43-2:所述智能卡判断所述智能卡读取且未处理的应用组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤43-3;否则执行步骤43-4;
[0347] 步骤43-3:所述智能卡对未处理的应用组件数据的内容进行处理,并根据所处理应用组件数据的字节数对第二计数器进行相应的减操作;
[0348] 在本实施例中,第二计数器为0时,确定当前读取的应用组件数据的内容处理完毕;
[0349] 具体地,在本实施例中,所述应用组件中包含应用类数量和应用组件的应用标识符,处理所述应用组件数据的内容的具体操作步骤如下:
[0350] C-1:所述智能卡从应用组件中获取应用类数量和应用组件的应用标识符,并根据应用组件的应用标识符创建应用组件的应用标识符对象,生成应用标识符对象引用[0351] C-2:所述智能卡将应用标识符对象引用写入所述包信息类;
[0352] 步骤43-4:所述智能卡判断是否读取到应用组件数据结束标签,是则执行步骤43-6;否则执行步骤43-5;
[0353] 步骤43-5:所述智能卡判断所述通信缓冲区是否存在未读取的应用组件数据;若存在,则从所述通信缓冲区继续读取应用组件数据,并返回步骤43-2;若不存在,则执行步骤402;
[0354] 步骤43-6:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0355] 步骤407:所述智能卡从所述通信缓冲区读取导入组件数据并进行处理,处理过程与步骤404类似,区别是对组件数据的内容处理不同,具体步骤如下:步骤44-1:所述智能卡从所述通信缓冲区读取导入组件数据,并根据当前读取的导入组件数据中的第二字节长度设置第二计数器;
[0356] 在本实施例中,所述第二计数器用于计量当前读取的导入组件数据所包含的数据大小信息;
[0357] 步骤44-2:所述智能卡判断所述智能卡读取且未处理的导入组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤44-3;否则执行步骤44-4;
[0358] 步骤44-3:所述智能卡对未处理的导入组件数据的内容进行处理,并根据所处理导入组件数据的字节数对第二计数器进行相应的减操作;
[0359] 在本实施例中,第二计数器为0时,确定当前读取的导入组件数据的内容处理完毕;
[0360] 具体地,处理所述导入组件数据的内容的具体操作步骤如下:
[0361] D-1:所述智能卡从导入组件中获取导入包的相关信息;
[0362] 在本实施例中,所述导入组件包括多个导入包的相关信息,所述导入包的相关信息可以包含:导入包应用标识符、导入包序号,也可以进一步包含导入包包名;每个导入包标识对应一个导入包序号,每个导入包序号对应一个导入包;
[0363] D-2:所述智能卡创建导入数组;
[0364] D-3:所述智能卡从未解析的导入包的相关信息中获取导入包序号并存储至所述导入数组;
[0365] D-4:所述智能卡判断是否存在未解析的导入包的相关信息,是则返回步骤D-3;否则确定对导入组件处理完毕;
[0366] 步骤44-4:所述智能卡判断是否读取到导入组件数据中结束标签,是则执行步骤44-6;否则执行步骤44-5;
[0367] 步骤44-5:所述智能卡判断所述通信缓冲区是否存在未读取的导入组件数据;若存在,则从所述通信缓冲区继续读取导入组件数据,并返回步骤44-2;若不存在,则执行步骤402;
[0368] 步骤44-6:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0369] 步骤408:所述智能卡从所述通信缓冲区读取类组件数据并进行处理,下面将结合图6对类组件的处理方法进行介绍,具体步骤如下:
[0370] 步骤45-1:所述智能卡从所述目录数组中获取类组件的大小信息,根据类组件的大小为所述类组件分配第一存储地址段,并从所述通信缓冲区读取类组件数据,并将类组件数据存储至所述第一存储地址段;
[0371] 步骤45-2:所述智能卡判断是否读取完所述类组件包含的类组件数据,是则执行步骤45-3;否则返回步骤402;
[0372] 步骤45-3:所述智能卡对类组件数据内容进行处理并判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0373] 本实施例中,所述第一存储地址段存满表示所述类组件包含的类组件数据已读取完毕,也可以通过读取到类组件数据中结束标签确定所述类组件包含的类组件数据已读取完毕;所述类组件是程序执行的核心,包含CAP文件的所有接口信息和类信息,所述接口信息和类信息统称为类组件单元信息;
[0374] 具体地,所述类组件的具体步骤如下:
[0375] E-1:所述智能卡通过类组件单元信息标识位判断所述类组件单元信息是否为接口信息,是则执行步骤E-2;否则执行步骤E-3;
[0376] 优选地,在本实施例中,所述类组件单元信息标识位为1时表示所述类组件单元信息为所述接口信息,所述类组件单元信息标识位为0时表示所述类组件单元信息为所述类信息;
[0377] E-2:所述智能卡处理所述接口信息;
[0378] E-3:所述智能卡处理所述类信息;
[0379] 步骤409:所述智能卡从所述通信缓冲区读取方法组件数据并进行处理,处理过程与步骤408类似,区别是对组件数据的内容处理不同,具体步骤如下:
[0380] 步骤46-1:所述智能卡从所述目录数组中获取方法组件的大小信息,根据方法组件的大小为所述方法组件分配第二存储地址段,并从所述通信缓冲区读取方法组件数据,并将方法组件数据存储至所述第二存储地址段;
[0381] 步骤46-2:所述智能卡判断是否读取完所述方法组件包含的方法组件数据,是则对清空所述方法组件数据的内容中异常信息,并执行步骤46-3;否则返回步骤402;
[0382] 本实施例中,所述第一存储地址段存满表示所述方法组件包含的方法组件数据已读取完毕,也可以通过读取到方法组件数据中结束标签确定所述方法组件包含的方法组件数据已读取完毕;
[0383] 步骤46-3:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0384] 步骤410:所述智能卡从所述通信缓冲区读取静态域组件数据并进行处理,处理过程与步骤404类似,区别是组件数据的内容的处理不同,具体操作如下:步骤47-1:所述智能卡从所述通信缓冲区读取静态域组件数据,并根据当前读取的静态域组件数据中的第二字节长度设置第二计数器;
[0385] 在本实施例中,所述第二计数器用于计量当前读取的静态域组件数据所包含的数据大小信息;
[0386] 步骤47-2:所述智能卡判断所述智能卡读取且未处理的静态域组件数据的大小与第二计数器的计数是否匹配;若匹配,则执行步骤47-3;否则执行步骤47-4;
[0387] 步骤47-3:所述智能卡对未处理的静态域组件数据的内容进行处理,并根据所处理静态域组件数据的字节数对第二计数器进行相应的减操作;
[0388] 在本实施例中,第二计数器为0时,确定当前读取的静态域组件数据的内容处理完毕;
[0389] 具体地,处理静态域组件的内容的具体操作步骤如下:
[0390] G-1:所述智能卡从所述目录组件中获取所述静态域组件的大小信息,并根据所述静态域组件的大小为所述静态域组件分配第三存储地址段;
[0391] G-2:所述智能卡将所述静态域组件存储至所述第三存储地址段;
[0392] G-3:所述智能卡创建静态数组并对所述静态数组进行初始化;
[0393] 优选地,在本实施例中,所述智能卡使用缺省值(0)来初始化静态数组;
[0394] G-4:所述智能卡清除未初始化的静态数组;
[0395] 步骤47-4:所述智能卡判断是否读取到静态域组件数据中结束标签,是则执行步骤47-6;否则执行步骤47-5;
[0396] 步骤47-5:所述智能卡判断所述通信缓冲区是否存在未读取的静态域组件数据;若存在,则从所述通信缓冲区继续读取静态域组件数据,并返回步骤47-2;若不存在,则执行步骤402;
[0397] 步骤47-6:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0398] 步骤411:所述智能卡从所述通信缓冲区读取导出组件数据并进行处理,处理过程与步骤408类似,区别在于组件数据的内容处理不同,具体步骤如下:
[0399] 步骤48-1:所述智能卡从所述目录数组中获取导出组件的大小信息,根据方法组件的大小为所述导出组件分配第四存储地址段,并从所述通信缓冲区读取导出组件数据,并将导出组件数据存储至所述第四存储地址段;
[0400] 步骤48-2:所述智能卡判断是否读取完所述导出组件包含的导出组件数据,是则对所述导出组件进行处理,并执行步骤48-3;否则返回步骤402;
[0401] 具体地,处理所述导出组件的具体操作步骤如下:
[0402] 所述导出组件包含:类偏移地址、静态域偏移数组、静态方法偏移数组;
[0403] H-1:所述智能卡为所述类偏移地址分配虚拟机标识;
[0404] H-2:所述智能卡从所述静态域偏移数组中获取静态域的偏移地址,根据所述静态域的偏移地址得到静态域引用,并为所述静态域引用分配虚拟机标识;
[0405] H-3:所述智能卡从静态方法偏移数组中获取静态常量池索引的偏移地址,根据所述静态常量池索引的偏移地址得到静态方法引用,并为所述静态方法引用分配虚拟机标识;
[0406] 步骤48-3:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0407] 步骤412:所述智能卡从通信缓冲区读取常量池组件并进行处理,具体步骤如下:
[0408] 步骤49-1:所述智能卡从所述目录数组中获取常量池组件的大小信息,并判断是否小于第一存储器的存储空间,是则从所述通信缓冲区读取常量池组件数据并将常量池组件数据存储至第一存储器中;否则从所述通信缓冲区读取常量池组件数据并将所述常量池组件数据存储至第二存储器中;
[0409] 在本实施例中,所述第一存储器为随机存储器,第二存储器为非易失性存储器;
[0410] 步骤49-2:所述智能卡判断是否读取完所述导出组件包含的导出组件数据,是则对所述导出组件进行处理,并执行步骤49-3;否则返回步骤402;
[0411] 具体地,处理所述常量池组件的操作步骤为:
[0412] I-1:所述智能卡从所述常量池组件中获取常量池表项数组的元素个数,并将第三计数器的计数值设置为所述常量池表项数组的元素个数;
[0413] 在本实施例中,所述第三计数器用于计量常量池表项数组的元素个数;
[0414] I-2:所述智能卡从常量池组件中获取所述常量池表项数组元素,并根据常量池表项数组当前元素的标签判断所述常量池表项数组当前元素的类型;
[0415] 在本实施例中,所述常量池表项数组的元素类型包括:类引用、实例引用、父类方法引用、静态域引用、静态方法引用;
[0416] 优选地,在本实施例中,所述常量池表项数组当前元素的第一个字节表示所述常量池表项数组当前元素的标签;
[0417] I-3:所述智能卡根据所述常量池表项数组元素的类型执行相应操作,具体见实施例4解析常量池组件的方法,在此不赘述;
[0418] I-4:所述智能卡对第三计数器的计数值执行减1操作;
[0419] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述常量池表项数组中未解析的元素个数;
[0420] I-5:所述智能卡判断第三计数器的计数值是否等于0,是则确定对常量池组件解析完毕;否则返回步骤I-2;
[0421] 步骤49-3:所述智能卡判断所述通信缓冲区是否存在未被读取的数据,如果存在,则执行步骤403;如果不存在,则执行步骤402;
[0422] 步骤413:所述智能卡从所述通信缓冲区读取位置引用组件数据并进行处理,具体处理过程与实施例1中步骤113相同,在此不再赘述。
[0423] 实施例3
[0424] 本发明实施例3提供了一种智能卡下载并解析常量池组件的方法,下面结合图7进行介绍,具体步骤如下:
[0425] 步骤701:智能卡从目录数组中获取常量池组件的大小信息;
[0426] 在本实施例中,所述智能卡在下载解析目录组件时从所述目录组件中获取12组件的大小信息,并存于目录数组中;
[0427] 步骤702:所述智能卡判断常量池组件是否小于第一存储器的存储空间,是则执行步骤703;否则执行步骤704;
[0428] 在本实施例中,所述第一存储器为随机存储器;
[0429] 步骤703:所述智能卡从通信缓冲区读取常量池组件数据并存储至第一存储器中,执行步骤705;
[0430] 步骤704:所述智能卡从通信缓冲区读取常量池组件数据并存储至第二存储器中,执行步骤705;
[0431] 在本实施例中,所述第二存储器为非易失性存储器;
[0432] 步骤705:所述智能卡判断是否读取完所述常量池组件包含的常量池组件数据,是则执行步骤706,否则返回步骤702;
[0433] 步骤706:所述智能卡从所述常量池组件中获取常量池表项数组的元素个数并将第三计数器的计数值设置为所述常量池表项数组的元素个数;
[0434] 在本实施例中,所述第三计数器用于计量常量池表项数组的元素个数;
[0435] 步骤707:所述智能卡从常量池组件中获取一个常量池表项数组的元素;
[0436] 在本实施例中,所述常量池表项数组的元素类型包括:类引用、实例引用、父类方法引用、静态域引用、静态方法引用;
[0437] 步骤708:所述智能卡根据当前元素的标签判断常量池表项数组当前元素类型;根据不同的元素类型执行相应的操作,解析当前元素得到常量池表项的内容;
[0438] 在本实施例中,所述常量池表项数组当前元素的第一个字节表示当前元素的标签;具体地,解析后的常量池表项数组的内容具体包括:导入包类虚拟机标识、包内类虚拟机标识、导入包类实例引用的大小、包内类实例引用的大小、导入包父类方法虚拟机标识、包内父类方法虚拟机标识、导入包静态域虚拟机标识、包内静态域虚拟机标识、导入包静态方法虚拟机标识、包内静态方法虚拟机标识;
[0439] 常量池表项数组当前元素类型为类引用时,执行如下操作:
[0440] 步骤72-1:所述智能卡判断常量池表项数组当前元素的最高位是否为1,是则执行步骤72-2;否则执行步骤72-8;
[0441] 在本实施例中,当所述常量池表项数组当前元素类型为实例引用时,最高位为1,表示类是在导入包中定义的,所述常量池表项数组当前元素中包含导入包标识;最高位为0,表示所述类是在包内定义的,所述常量池表项数组当前元素中包含包内类标识;
[0442] 步骤72-2:所述智能卡通过所述常量池表项数组当前元素得到导入包标识获取导入包序号;
[0443] 步骤72-3:所述智能卡根据所述导入包序号获取导入包类标识;
[0444] 在本实施例中,所述常量池表项数组当前元素类型为类实例引用时,所述导入包序号指向的地址中存储的内容是导入包类标识;
[0445] 步骤72-4:所述智能卡根据所述导入包类标识获取导入包类虚拟机标识;
[0446] 在本实施例中,所述导入包类标识指向的地址中存储的内容是所述导入包类虚拟机标识;
[0447] 步骤72-5:所述智能卡根据所述导入包类虚拟机标识获取引用表索引数组元素;
[0448] 在本实施例中,所述导入包类虚拟机标识指向所述引用表索引数组元素的地址,引用表索引数组元素的地址中处存储的内容是引用表索引数组元素;
[0449] 步骤72-6:所述智能卡根据引用表索引数组元素获取导入包类引用标识;
[0450] 在本实施例中,所述引用表索引数组元素即所述导入包类引用标识在类组件中的偏移地址,引用表索引数组元素指向的地址中存储的内容是导入包类引用;
[0451] 步骤72-7:所述智能卡根据所述导入包类引用标识获取导入包类实例的大小,并将所述导入包类实例的大小写入所述常量池表项数组替换当前元素,执行步骤709;
[0452] 在本实施例中,所述导入包类引用标识指向偏移地址的第三个字节表示所述导入包类实例的大小;
[0453] 步骤72-8:所述智能卡根据所述常量池表项数组当前元素得到包内标识并获取包内类虚拟机标识;
[0454] 在本实施例中,所述包内类标识指向的地址中存储的内容是所述包内类虚拟机标识;
[0455] 步骤72-9:所述智能卡根据所述包内类虚拟机标识获取引用表索引数组元素;
[0456] 在本实施例中,根据包内类虚拟机标识指向所述引用表索引数组元素的位置,引用表索引数组元素的位置处存储的内容是引用表索引数组元素;
[0457] 步骤72-10:所述智能卡根据引用表索引数组元素获取包内类引用标识;
[0458] 在本实施例中,所述引用表索引数组元素即所述包内类引用标识在类组件中的偏移地址;
[0459] 步骤72-11:所述智能卡根据所述包内类引用标识获取包内类实例的大小,并将所述包内类实例的大小写入所述常量池表项数组替换当前元素,执行步骤709;
[0460] 优选地,在本实施例中,所述包内类引用标识指向偏移地址的第三个字节表示所述包内类实例的大小;
[0461] 常量池表项数组当前元素类型为父类方法引用时,执行如下操作:
[0462] 步骤73-1:所述智能卡判断常量池表项数组当前元素的最高位是否为1,是则执行步骤73-2,否则执行步骤73-8;
[0463] 在本实施例中,当所述常量池表项数组当前元素类型为父类方法引用时,最高位为1,表示父类方法是在导入包中定义的,所述常量池表项数组当前元素中包含导入包标识;最高位为0时,表示父类方法是在包内定义的,所述常量池表项数组当前元素中包含包内父类标识;
[0464] 步骤73-2:所述智能卡通过所述常量池表项数组当前元素得到导入包标识并获取导入包序号;
[0465] 步骤73-3:所述智能卡根据所述导入包序号获取导入包父类标识;
[0466] 在本实施例中,所述常量池表项数组当前元素类型为父类方法引用时,所述导入包序号指向的地址中存储的内容是导入包父类标识;
[0467] 步骤73-4:所述智能卡根据所述导入包父类标识获取导入包父类虚拟机标识;
[0468] 在本实施例中,所述导入包父类标识指向的地址中存储的内容是所述导入包父类虚拟机标识;
[0469] 步骤73-5:所述智能卡根据所述导入包父类虚拟机标识获取方法表基数;
[0470] 在本实施例中,所述导入包父类虚拟机标识指向的地址中存储的内容是方法表,根据所述方法表得到方法表基数;
[0471] 步骤73-6:所述智能卡判读方法表基数是否小于所述导入包父类标识;是则执行步骤73-7;否则执行步骤73-8;
[0472] 步骤73-7:所述智能卡从所述方法表中获取导入包父类方法虚拟机标识,并将所述导入包父类方法虚拟机标识写入所述常量池表项数组替换当前元素,执行步骤709;
[0473] 在本实施例中,所述方法表中中包含导入包父类虚拟机标识;
[0474] 步骤73-8:所述智能卡获取当前导入包父类标识对应的导入包父类的父类的标识,判断所述导入包父类的父类的标识是否为非法标识,如果所述导入包父类的父类的标识为所述非法标识,则执行步骤709,如果所述导入包父类的父类的标识不是所述非法标识,则使用所述导入包父类的父类的标识替换当前导入包父类标识,返回步骤73-4;
[0475] 步骤73-9:所述智能卡根据所述常量池表项数组当前元素得到包内父类标识并获取包内父类虚拟机标识;
[0476] 在本实施例中,所述常量池表项数组当前元素类型为父类方法引用时,包内父类标识指向的地址中存储的内容是所述包内父类虚拟机标识;
[0477] 步骤73-10:所述智能卡根据所述包内父类虚拟机标识获取包内父类方法标识;
[0478] 在本实施例中,所述包内父类虚拟机标识指向的地址中存储的内容是所述包内父类方法标识;
[0479] 步骤73-11:所述智能卡根据所述包内父类方法标识获取包内父类方法虚拟机标识,并将所述包内父类方法虚拟机标识写入所述常量池表项数组替换当前元素,执行步骤709;
[0480] 在本实施例中,所述包内父类方法标识指向的地址中存储的内容是包内父类方法虚拟机标识;
[0481] 常量池表项数组当前元素类型为静态域引用时,执行如下操作:
[0482] 步骤74-1:所述智能卡判断常量池表项数组当前元素的最高位是否为1,是则执行步骤74-2,否则执行步骤74-5;
[0483] 在本实施例中,所述常量池表项数组当前元素类型为静态域引用时,最高位为1,表示静态域是在导入包中定义的,所述常量池表项数组当前元素包含导入包标识;最高位为0时,表示静态域是在包内定义的,所述常量池表项数组当前元素包含包内静态域标识;
[0484] 步骤74-2:所述智能卡通过常量池表项数组当前元素得到导入包标识,并根据导入包标识获取导入包序号;
[0485] 在本实施例中,所述包内静态域标识指向的地址中存储的内容是所述包内静态域虚拟机标识;
[0486] 步骤74-3:所述智能卡根据导入包序号得到导入包静态域标识;
[0487] 在本实施例中,所述导入包序号指向的地址中存储的内容是导入包静态域标识;
[0488] 步骤74-4:所述智能卡根据导入包静态域标识获取导入包静态域虚拟机标识,将导入包静态域虚拟机标识写入常量池表项数组替换当前元素,执行步骤709;
[0489] 在本实施例中,所述导入包静态域标识指向的地址中存储的内容是所述导入包静态域虚拟机标识;
[0490] 步骤74-5:所述智能卡根据所述常量池表项数组当前元素得到包内静态域标识并获取包内静态域虚拟机标识,并将所述包内静态域虚拟机标识写入常量池表项数组替换当前元素,执行步骤709;
[0491] 常量池表项数组当前元素类型为静态方法引用时,执行如下操作:
[0492] 步骤75-1:所述智能卡判断常量池表项数组当前元素的最高位是否为1,是则执行步骤75-1;否则执行步骤75-5;
[0493] 在本实施例中,所述常量池表项数组当前元素为静态方法引用时,最高位为1,表示静态方法是在导入包中定义的,所述常量池表项数组当前元素包含导入包标识;最高位为0时,表示静态方法是在包内定义的,所述常量池表项数组当前元素包含包内静态方法标识;
[0494] 步骤75-2:所述智能卡根据常量池表项数组当前元素得到导入包标识,并根据导入包标识获取导入包序号;
[0495] 步骤75-3:所述智能卡根据导入包序号得到导入包中静态方法标识;
[0496] 在本实施例中,所述常量池表项数组当前元素类型为静态方法引用时,所述导入包序号指向的地址中存储的内容是导入包中静态方法标识;
[0497] 步骤75-4:所述智能卡根据所述导入包静态方法标识获取导入包静态方法虚拟机标识,并将导入包静态方法虚拟机标识写入常量池表项数组替换当前元素,执行步骤709;
[0498] 在本实施例中,所述导入包静态方法标识指向的地址中存储的内容是所述导入包静态方法虚拟机标识;
[0499] 步骤75-5:所述智能卡根据所述常量池表项数组当前元素得到包内静态方法标识并获取包内静态方法虚拟机标识,并将所述包内静态方法虚拟机标识写入常量池表项数组替换当前元素,执行步骤709;
[0500] 在本实施例中,所述包内静态方法标识指向的地址中存储的内容是所述包内静态方法虚拟机标识;
[0501] 步骤709:所述智能卡对第三计数器的计数值执行减1操作;
[0502] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述常量池表项数组中未解析的元素个数;
[0503] 步骤710:所述智能卡判断第三计数器的计数值是否等于0,是则执行步骤711;否则返回步骤707;
[0504] 步骤711:所述智能卡清空常量池组件占用的存储空间;
[0505] 实施例4
[0506] 参见图8,本发明实施例4提供了一种智能卡下载并解析位置引用组件的方法,[0507] 具体步骤如下:
[0508] 步骤801:智能卡从通信缓冲区读取位置引用组件数据;
[0509] 在本实施例中,所述位置引用组件的操作数据包含的信息为:单字节索引数组元素个数的高字节、单字节索引数组元素个数的低字节、单字节索引数组的元素、双字节索引数组元素个数的高字节、双字节索引数组元素个数的低字节、双字节索引数组的元素;
[0510] 步骤802:所述智能卡判断第二状态标志位的取值,根据不同的取值执行相应的操作;
[0511] 在本实施例中,所述第二状态标志位的取值包括:第十一预设值、第十二预设值、第十三预设值、第十四预设值、第十五预设值、第十六预设值;
[0512] 优选地,在本实施例中,第二状态标志位的第十一预设值为0;第二状态标志位的第十二预设值为1;第二状态标志位的第十三预设值为2;第二状态标志位的第十四预设值为3;第二状态标志位的第十五预设值为4;第二状态标志位的第十六预设值为5;
[0513] 情况一
[0514] 当第二状态标志位的取值为第十一预设值,执行如下操作:
[0515] 步骤81-1:所述智能卡根据操作数据得到单字节索引数组元素个数的高字节位,并将第三计数器的值设置为所述单字节索引数组元素个数的高字节;
[0516] 在本实施例中,所述第三计数器用来计量单字节索引数组元素个数;
[0517] 步骤81-2:所述智能卡清空位置引用组件的当前操作数据;
[0518] 步骤81-3:所述智能卡将第二状态标志位的取值修改为第十二预设值,返回步骤801;
[0519] 当第二状态标志位的取值为第十二预设值,执行如下操作;
[0520] 步骤82-1:所述智能卡根据操作数据得到单字节索引数组长度的低字节位,并重置所述第三计数器;
[0521] 在本实施例中,所述智能卡重置所述第三计数器的具体操作为:所述智能卡将所述第三计数器的计数值左移八位后得到的值与单字节索引数组元素个数的低字的值相加;
[0522] 步骤82-2:所述智能卡清空位置引用组件的当前操作数据;
[0523] 步骤82-3:所述智能卡将第二状态状态标志位的取值修改为第十三预设值,返回步骤801;
[0524] 当第二状态标志位的取值为第十三预设值,执行如下操作;
[0525] 步骤83-1:所述智能卡判断当前操作数据的值是否等于255,是则执行步骤83-2;否则执行步骤83-3;
[0526] 在本实施例中,所述操作数据的值的范围为0~255;当所述智能卡处于单字节索引数组状态时,接收到的操作数据包含单字节索引数组元素,即第一常量池索引在方法组件内的偏移地址;
[0527] 步骤83-2:所述智能卡重置第四计数器后返回步骤401;
[0528] 在本实施例中,所述第四计数器用来计量第一常量池索引和第二常量池索引在方法组件内的偏移地址;所述智能卡初始化所述第四计数器的具体操作为:所述智能卡将第四计数器的当前计数值与255相加;
[0529] 步骤83-3:所述智能卡将第四计数器的计数值设置为第四计数器的当前计数值与当前操作数据值之和,并清空位置引用组件的当前操作数据;
[0530] 步骤83-4:所述智能卡根据所述第一常量池索引在方法组件内的偏移地址得到第一常量池索引的内容;
[0531] 在本实施例中,所述第一常量池索引在方法组件内的偏移地址指向的地址中存储的是第一常量池索引的地址,所述智能卡根据第一常量池索引的地址得到第一常量池索引的内容;
[0532] 步骤83-5:所述智能卡用第一常量池索引的内容替换所述第一常量池索引在方法组件内的偏移地址指向的地址中的内容;
[0533] 步骤83-6:所述智能卡对所述第三计数器的计数值执行减1操作;
[0534] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述单字节索引数组中未解析的元素个数;
[0535] 步骤83-7:所述智能卡判断所述第三计数器的计数值是否等于0,是则执行步骤83-8;否则返回步骤801;
[0536] 步骤83-8:所述智能卡将第二状态标志位的取值修改为第十四预设值,返回步骤801;
[0537] 当第二状态标志位的取值为第十四预设值,执行如下操作:
[0538] 步骤84-1:所述智能卡根据操作数据得到双字节索引数组元素个数的高字节,并将第三计数器设置为所述单字节索引数组元素个数的高字节;
[0539] 步骤84-2:所述智能卡清空位置引用组件的当前操作数据;
[0540] 步骤84-3:所述智能卡将第二状态标志位的取值修改为第十五预设值,返回步骤801;
[0541] 当第二状态标志位的取值为第十五预设值,执行如下操作:
[0542] 步骤85-1:所述智能卡重置所述第三计数器;
[0543] 在本实施中,所述智能卡重置所述第三计数器的具体操作为:所述智能卡将所述第三计数器的计数值左移八位后得到的值与双字节索引数组长度的低字节的值相加;
[0544] 步骤85-2:所述智能卡清空位置引用组件的操作数据;
[0545] 步骤85-3:所述智能卡将第二状态标志位的取值修改为第十六预设值,返回步骤801;
[0546] 当第二状态标志位的取值为第十六预设值,执行如下操作:
[0547] 步骤86-1:所述智能卡判断当前操作数据的值是否等于255,是则执行步骤86-2;否则执行步骤86-3;
[0548] 在本实施例中,所述操作数据的值的范围为0~255;当所述智能卡处于双字节索引数组状态时,接收到的操作数据包含双字节索引数组元素,即第二常量池索引在方法组件内的偏移地址;
[0549] 步骤86-2:所述智能卡初始化第四计数器后返回步骤801;
[0550] 在本实施例中,所述智能卡初始化第四计数器的具体操作为:所述智能卡将第四计数器的当前计数值与255相加;
[0551] 步骤86-3:所述智能卡将第四计数器的计数值设置为第四计数器的当前计数值与当前操作数据值之和,并清空接收到的操作数据;
[0552] 步骤86-4:所述智能卡根据所述第二常量池索引在方法组件内的偏移地址得到第二常量池索引的内容;
[0553] 在本实施例中,所述第二常量池索引在方法组件内的偏移地址指向的地址中存储的是第二常量池索引地址,所述智能卡根据第二常量池索引的地址得到第二常量池索引的内容;
[0554] 步骤86-5:所述智能卡用所述第二常量池索引的内容替换所述第二常量池索引在组件内的偏移地址指向的地址中的内容;
[0555] 步骤86-6:所述智能卡对所述第三计数器的计数值执行减1操作;
[0556] 在本实施例中,所述智能卡对所述第三计数器的计数值执行减1操作后,所述第三计数器的计数值表示所述双字节索引数组中未解析的元素个数;
[0557] 步骤86-7:所述智能卡判断所述第三计数器的计数值是否等于0,是则完成位置引用组件下载解析过程;否则执行步骤801。
[0558] 本发明实施例描述的方法中的步骤可以适应Java卡,也可适应其他类型的智能卡。
[0559] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。