2017-06-01 8 views
3

私は、最大60KBのデータをバイト配列に格納できるスマートカードアプリケーションを作成しました。しかし、私は配列を複数回読むとエラーが発生し、データにアクセスできなくなります。Java Cardのデータを配列から読み取る

コード配列の作成:私は読み書きできるアプリを再インストールするときにのみ、

short data_length = Util.getShort(buf, (short)(offset_cdata + 2)); 
    short file_offset = Util.getShort(buf, offset_cdata); 

    if(p2 == (byte)0x01) { 

     Util.arrayCopy(myfile.readDataFromFile(myfile.keepassData1, file_offset, data_length), (short)0, buf, (short)0, data_length); 

    } else if (p2 == (byte)0x02) { 

     Util.arrayCopy(myfile.readDataFromFile(myfile.keepassData2, file_offset, data_length), (short)0, buf, (short)0, data_length); 

    } 

public void createFile(short fileID, short fileSize) { 
    short index = getFileIndex(fileID); 

    if(listFiles[index] == null) { 
     listFiles[index] = new byte[fileSize]; 
    } 

    listfileSizes[index] = fileSize; 
} 

コード読み取りデータ:

public byte[] readDataFromFile(short fileID, short fileOffset, short length) { 

    short selFileSize = getFileSize(fileID); 
    byte[] data = new byte[length]; 

    if (selFileSize < (short)(fileOffset + length)) { 
     ISOException.throwIt(ISO7816.SW_FILE_FULL); 
    } 

    Util.arrayCopy(getFile(fileID), fileOffset, data, (short)0, length); 

    return (byte[])data; 
} 

コードアクセス読み取りをデータがブロックされるまで少し時間がかかります。私はエラー6f00を取得します。

答えて

4

あなたのアプレットはであり、永続メモリが不足しているため、エラーです。

このライン

byte[] data = new byte[length]; 

新しい持続バイト配列メソッドが呼び出されるたびに割り当てます! Java Cardは自動ガベージコレクタをサポートしていないため、このオブジェクトは決して割り当て解除されません。

あなたはAPDUバッファにデータを直接コピーする必要があります。

private final byte[] readDataFromFile(short fileID, short fileOffset, short length, byte[] outBuffer, short outOffset) { 
    final short selFileSize = getFileSize(fileID); 
    if (selFileSize < (short)(fileOffset + length)) { 
     ISOException.throwIt(ISO7816.SW_FILE_FULL); 
    } 
    Util.arrayCopyNonAtomic(getFile(fileID), fileOffset, outBuffer, outOffset, length); 
} 
+0

[OK]をthankyを私はそれをしようとします – schisskiss

関連する問題