我正在开发一个小票务原型。 我想要做的是 - 如果选择了顶级ADF,我想返回所有包含DF的AID,并且第一眼看上去它的效果非常好。
我创建了ADF,以及1或2个DF。选择ADF后,这些DF的AID返回正常,我可以添加EF(或DF),......
现在,当我重新启动整个事情时(我正在使用JCOP顺便说一句。)我仍然可以选择ADF,但DF中的AID不再返回,事实上我得到6F00“没有精确诊断”。
对于我的数据结构 - 首先你会看到ADF的最小构造函数,它没有父元素
public DirectoryFile(byte[] aid) {
super(aid);
this.aid = aid;
numApp = 1;
created = true;
}
第二个结构是相同的,但是对于带有parentDirectoryFile的“通常”DirectoryFile和基本文件的数组(arrayFiles):
public DirectoryFile(byte[] aid, DirectoryFile parent) {
super(aid, parent);
for (byte i = 0; i < numberFiles; i++) {
arrayFiles[i].setActive(false);
}
}
都继承自相同的File.class
public File (byte aid[]) {
Util.arrayCopy(aid, (short) 0, this.aid, (short) 0, (short) 6);
}
public File (byte[] aid, DirectoryFile parentFile) {
this.parentFile = parentFile;
Util.arrayCopy(aid, (short) 0, this.aid, (short) 0, (short) 6);
}
这应该是一个非常基本的文件系统,只要卡连接到终端就可以正常工作,但是重启程序后信息似乎丢失了,尽管我根本没有使用瞬态数组。 / p>
返回代码始终是“6F00 - 没有精确诊断”,这导致了一个未推荐的byte []或类似的东西,除了DF对象之外我找不到任何东西,它们在创建新Object时会被实现。< / p> 编辑:刚才发现它可能是一个更“普遍”的问题,这就是我做错了。
现在,如果我采用像http://umer555.wordpress.com/2012/05/17/java-card-hello-world-applet/这样的“Hello World”并添加一些INS,就像我在这里做的那样:
public class HalloWeltApplet extends Applet {
private static byte[] helloWorld = new byte[11];
private static final byte HW_CLA = (byte)0x80;
private static final byte HW_INS = (byte)0x00;
private static final byte HW_INS1 = (byte)0x01;
private static final byte HW_INS2 = (byte)0x02;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new HalloWeltApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
if(CLA != HW_CLA) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch(INS) {
case HW_INS:
getHelloWorld(apdu);
break;
case HW_INS1:
getHelloWorld1(apdu);
break;
case HW_INS2:
getHelloWorld2(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void getHelloWorld( APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = (short) helloWorld.length;
byte[] test = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};
Util.arrayCopy(test, (short) 0, helloWorld, (short) 0, (short) test.length);
}
private void getHelloWorld1( APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = (short) helloWorld.length;
byte[] test = {(byte)'H',(byte)'i',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d'};
Util.arrayCopy(test, (short) 0, helloWorld, (short) 0, (short) test.length);
}
private void getHelloWorld2( APDU apdu) {
byte[] buffer = apdu.getBuffer();
apdu.setOutgoing();
apdu.setOutgoingLength((short) helloWorld.length);
apdu.sendBytesLong(helloWorld, (short) 0, (short) helloWorld.length);
}
}
所以这应该在我的眼中将'Hello World'或'Hi World'保存到helloWorld
中,使用INS2我可以显示哪一个被保存。但每当我重新启动程序时,由于启动,helloWorld
将为空,对吗?毕竟这可能是我的问题,如果是的话,怎么解决?
答案 0 :(得分:1)
问题可能在这里:
super(aid);
this.aid = aid;
首先,您正确复制数据,然后使用File
构造函数中使用的字段覆盖DirectoryFile
中的字段。如果这是一个瞬态缓冲区或更糟糕的,JCRE拥有APDU缓冲区,那么您的代码将失败,因为JCRE拥有的对象不应该通过持久引用来使用。
请注意,AID是应用程序标识符。它们识别诸如Java Card applet之类的应用程序。通常,文件和非应用程序DF(尤其是子DF)不是用AID标识或选择的,而是具有文件标识符或(相关的)短文件标识符。有关详细信息,请参阅ISO / IEC 7816-4(我猜的任何版本)。
请注意,重置在JCOP模拟器中有效,但重启过程时所有信息都会丢失;数据未保存到磁盘,必须重新加载applet。