0

创建目录文件时遇到问题。我显然不是在创建一个新对象,而只是创建一个参考 - 只是仍然不确定在哪里/为什么!

DirectoryFile[] arrayDF = new DirectoryFile[8];

现在当我创建一个新的 DF 时:

numapp++;
arrayDF[numApp] = new DirectoryFile(aid);

之后我只是循环打印出来

APDU apdu = APDU.getCurrentAPDU();
apdu.setOutgoing();
apdu.setOutgoingLength((short) 21);

for (i = 2; i <= numApp; i++) {          
     apdu.sendBytesLong(arrayDF[i].getAID(), (short) 0, (short) 6);

}

其中 numApp 是应用程序/DF 的数量,从 2 开始,因为 1 是 MasterFile。援助 = a00000000001 我得到

A0 00 00 00 00 01 90 00                         .........
Status: No Error

作为对援助的回应= a00000000002 我得到

A0 00 00 00 00 02 A0 00 00 00 00 02 90 00    ................
Status: No Error

援助 = a00000000003 我得到

A0 00 00 00 00 03 A0 00 00 00 00 03 A0 00 00 00 00 03 90 00    ................
    Status: No Error

所以所有已经保存的 AID 都会以某种方式被覆盖。在 DirectoryFile 我做如下

public DirectoryFile(byte[] aid) {
        super(aid);
        for (byte i = 0; i < activatedFiles.length; i++)
            activatedFiles[i] = false;

    }

其中 super(aid) 调用 File.java 的构造函数

     public abstract class File {
            public byte[] aid = new byte[6];

            public File (byte[] aid) {
                this.aid = aid; 
            }
            public byte[] getAID() {
                return aid;
            }
     }

我这样做的错误在哪里?

经过更多测试后,我至少发现类(DirectoryFile,File)应该可以正常工作:

 aDF[j] = new DirectoryFile(aid1);
      j++;
      aDF[j] = new DirectoryFile(aid2);
      j++;
      aDF[j] = new DirectoryFile(aid3);
      j++;
      aDF[j] = new DirectoryFile(aid4);
      j++;
      APDU apdu = APDU.getCurrentAPDU();
      apdu.setOutgoing();
      byte[] myi = new byte[1];
      apdu.setOutgoingLength((short) 28);
      for (j = 0; i < 4; i++) {      
        myi[0] = i;       
        apdu.sendBytesLong(myi, (short) 0, (short) 1);
        apdu.sendBytesLong(aDF[i].getAID(), (short) 0, (short) 6);

将打印

00 A0 00 00 00 00 01 01 A0 00 00 00 00 02 02 A0    ................
    00 00 00 00 03 03 A0 00 00 00 00 04 90 00          ..............
Status: No Error
4

1 回答 1

0

您的File实现不正确,您首先生成一个 6 字节的数组,但不是将 AID 复制到其中 - 使用Util.arrayCopy()- 您只需将其分配给传入数组的引用,并抛出对先前生成的aid缓冲区的引用。因此,如果传入的 AID 的值改变了值,那么输入的 AID 的值File也会改变。

于 2013-09-28T13:06:01.617 回答