文件系统创建—Java Card开发第二篇
2016-04-02 14:07
459 查看
首先要知道Java card里面的文件系统结构,也就是有哪些文件:
包括四大类文件,应用基本文件——也就是发卡方官方的一些信息,然后是持卡人个人信息的文件,再就是EP(电子钱包)文件,以及最重要的密钥文件。并且密钥文件必须先于其他三个文件之前创建,因为没密码你弄啥操作不科学呀。
几大文件反应到代码中就是几大数据结构:
理解了文件系统之后就要一一去看各个文件代码模块是怎么实现的:
举个例子:
这是二进制文件数据结构的部分代码,可以看到它的构造函数需要传进一个pdata参数,其实就是要传输apdu命令的data部分给它。由于这几大数据结构代码课上都给得差不多了,而且本篇只讲文件系统的创建,所以目前只需要知道这几大文件数据结构的接口就够了,主要还是看主程序代码,也就是purse.java。嗯,本次java card的开发就是以电子钱包的开发作为项目来学习的。
先直接上主程序purse.java的代码,其他几个java文件的代码在后面学习篇再放:
既然是要创建文件,当然就要先从终端获取apdu命令,判断它的命令里面是不是要卡片创建文件,怎么判断呢?通过ins值,就是这句代码:
这里有个常量,在condef.java中定义:
condef.java文件里面定义了一些ins值常量,还有就是如果是要创建文件,那要创建的是什么文件呢,通过pdata的第一位判断,也就是pdata[0]:
所以condef.java里面也定义了这部分文件类型的常量。
既然已经判断出了apdu命令是要我们创建文件,同时又判断出了要创建的是什么文件,接下来就简单了,就是直接调用几大文件数据结构的接口去创建相应的文件,同时,这里要判断一些异常的情况,也就是apdu命令有输入错误的情况,然后返回相应的异常给终端。比如:
嗯,创建文件就是这么简单了,主要就是要理解文件系统里面的几大文件,同时看懂文件数据结构的几个java文件是怎么实现的。然后调用就很简单了。
最后,看看运行结果,由于终端要发送不少命令,所以可以把命令全部放到文件里面,然后直接在命令行中读取文件,然后就会在模拟器中执行文件里面的所有命令了。
首先,把命令脚本名称改一下,主要是改后缀名为jcsh:
然后运行之后再命令行中先输入:
查找文件路径的快速方法(通用电脑小常识),查询文件属性,然后就可以看到文件所在的路径了。
输入上面那条路径命令之后,就再输入文件名(不包括后缀),比如这里是purse,然后回车就可以让模拟器执行命令脚本里面的所有命令了,注意,有时候脚本文件里面会有一些奇奇怪怪的未注释的中文字符,比如中文的空格,有很多软件开发工具都对这些非常敏感会导致执行脚本出错,我在执行脚本的时候就遇到了,解决办法是重新建一个txt文件,然后改下文件名,把脚本命令复制进来。
命令脚本内容:
运行结果:
可以看到都是No Error.也就把四大文件都给建立好了,后面的就是在文件里面进行添加密钥等等的操作了,这是后面学习篇的内容。值得注意的是,每次重新运行的时候,模拟器不会保存你之前创建的文件,毕竟只是个模拟器嘛。所以除非一直运行着保留着上面创建文件的状态,否则重新运行后应当重新建立文件。
包括四大类文件,应用基本文件——也就是发卡方官方的一些信息,然后是持卡人个人信息的文件,再就是EP(电子钱包)文件,以及最重要的密钥文件。并且密钥文件必须先于其他三个文件之前创建,因为没密码你弄啥操作不科学呀。
几大文件反应到代码中就是几大数据结构:
理解了文件系统之后就要一一去看各个文件代码模块是怎么实现的:
举个例子:
这是二进制文件数据结构的部分代码,可以看到它的构造函数需要传进一个pdata参数,其实就是要传输apdu命令的data部分给它。由于这几大数据结构代码课上都给得差不多了,而且本篇只讲文件系统的创建,所以目前只需要知道这几大文件数据结构的接口就够了,主要还是看主程序代码,也就是purse.java。嗯,本次java card的开发就是以电子钱包的开发作为项目来学习的。
先直接上主程序purse.java的代码,其他几个java文件的代码在后面学习篇再放:
既然是要创建文件,当然就要先从终端获取apdu命令,判断它的命令里面是不是要卡片创建文件,怎么判断呢?通过ins值,就是这句代码:
case condef.INS_CREATE_FILE: return create_file();
这里有个常量,在condef.java中定义:
condef.java文件里面定义了一些ins值常量,还有就是如果是要创建文件,那要创建的是什么文件呢,通过pdata的第一位判断,也就是pdata[0]:
所以condef.java里面也定义了这部分文件类型的常量。
既然已经判断出了apdu命令是要我们创建文件,同时又判断出了要创建的是什么文件,接下来就简单了,就是直接调用几大文件数据结构的接口去创建相应的文件,同时,这里要判断一些异常的情况,也就是apdu命令有输入错误的情况,然后返回相应的异常给终端。比如:
if(papdu.cla != (byte)0x80) ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); if(papdu.lc != (byte)0x07) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); if(EPfile != null)//有文件了还重复创建则会报错 ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED); if(keyfile == null)//都还没密钥文件(必须先于任何其他文件创建) ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
嗯,创建文件就是这么简单了,主要就是要理解文件系统里面的几大文件,同时看懂文件数据结构的几个java文件是怎么实现的。然后调用就很简单了。
最后,看看运行结果,由于终端要发送不少命令,所以可以把命令全部放到文件里面,然后直接在命令行中读取文件,然后就会在模拟器中执行文件里面的所有命令了。
首先,把命令脚本名称改一下,主要是改后缀名为jcsh:
然后运行之后再命令行中先输入:
/set-var path "文件路径(不包括文件名.jcsh)"
查找文件路径的快速方法(通用电脑小常识),查询文件属性,然后就可以看到文件所在的路径了。
输入上面那条路径命令之后,就再输入文件名(不包括后缀),比如这里是purse,然后回车就可以让模拟器执行命令脚本里面的所有命令了,注意,有时候脚本文件里面会有一些奇奇怪怪的未注释的中文字符,比如中文的空格,有很多软件开发工具都对这些非常敏感会导致执行脚本出错,我在执行脚本的时候就遇到了,解决办法是重新建一个txt文件,然后改下文件名,把脚本命令复制进来。
命令脚本内容:
运行结果:
可以看到都是No Error.也就把四大文件都给建立好了,后面的就是在文件里面进行添加密钥等等的操作了,这是后面学习篇的内容。值得注意的是,每次重新运行的时候,模拟器不会保存你之前创建的文件,毕竟只是个模拟器嘛。所以除非一直运行着保留着上面创建文件的状态,否则重新运行后应当重新建立文件。
相关文章推荐
- activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程
- activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程
- 归并排序java语言实现--用递归的方法
- (Eclipse)调试符号
- JAVA安全模型
- java作业 流水线
- SpringMvc:处理模型数据
- java反射详解
- json与Java对象转化出现net.sf.json.JSONException: There is a cycle in the hierarchy!问题
- Java中 复制文件并命名的超简洁写法
- java虚拟机 jvm 局部变量表实战
- java虚拟机 jvm 局部变量表实战
- 【细说Java】Java封箱拆箱的一些问题
- JavaWeb-10(会话技术之session&JSP)
- springMVC4(6)Unitils断言与整合测试
- Spring的jar包描述
- 使用Struts实现防止表单重复提交
- JAVA中String的常用方法?
- java单例设计模式总结
- java实现归并排序