2013-03-26 25 views
2

我正在寫一個applet,可以存儲3個不同大小的文件,大小分別爲5 Kb,7 Kb和11 Kb。我將這些文件存儲在小程序中沒有問題。但是當我嘗試閱讀他們時,我只能閱讀前兩個(較小的文件)。 第三個文件拋出異常:從javacard applet讀取大文件

javax.smartcardio.CardException: Could not obtain response 
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source) 
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source) 

我試圖搞清楚這個問題,我發現了它與文件的大小有關。所以我創建了一個大小爲7Kb的測試文件,並逐漸增加了這個文件。 它工作,直到我達到7905字節。這意味着7905字節是我可以從小程序讀取的最大字節數。 我鏈接使用代碼示例響應:

public void readFile(APDU apdu, short[] offset, short selectedFile, short MAX_APDU_SEN,  byte OFFSET_SENT) { 
    byte[] file = getFile(selectedFile); 
    if (file == null) { 
    + ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);+ 
    } 
    // work out how many bytes to send this time and how many will be left 
    short remain = (short) (file.length - offset[OFFSET_SENT]); 
    boolean chain = remain > MAX_APDU_SEN; 
    short sendLen = chain ? MAX_APDU_SEN : remain; 
    apdu.setOutgoing(); 
    apdu.setOutgoingLength(sendLen); 
    apdu.sendBytesLong(file, offset[OFFSET_SENT], sendLen); 
    // Check to see if there are more APDU's to send 
    if (chain) { 
    +offset[OFFSET_SENT] = sendLen; // count the bytes sent 
    ISOException.throwIt(ISO7816.SW_BYTES_REMAINING_00); // indicate there are more bytes  to come 
    } else {+ 
    offset[OFFSET_SENT] = 0; // no more bytes to send 
    } 
} 

我已經嘗試了兩種不同類型的卡即JC 2.2.1(36KB)和JC 2.2.2(80KB)兼容卡,但它們都具有相同的行爲。

請幫忙嗎?

回答

2

讀取文件通常不會使用鏈接完成,因爲主機應用程序可以方便地指定P1/P2中的起始偏移量 - 至少在ISO 7816-4中指定的READ BINARY命令中。我假設,即使對於鏈式響應,卡想要在緩衝區中準備數據,緩衝區的大小我認爲是您的問題的原因。

+0

Thanx guidot。我刪除了鏈接,並讓我的主機應用程序讀取256個字節的小塊,每次將偏移量增加256.它工作正常。我甚至試圖讀取一個20 Kb的文件,結果是積極的。所以我假設鏈接不能承受非常大的文件。無論如何,我都是錯的。 – ally 2013-03-27 23:08:50

+0

您可能仍會嘗試擴展長度的APDU以獲得更大的塊,但支持的限制取決於卡。更少的命令發送意味着更少的開銷,所以你可以節省一些時間,這可能是一個20 KByte文件通知。 – guidot 2013-03-28 07:36:21

+0

@盟友,你可以與我分享代碼我是新來的Java卡,並有相同的問題存儲更大的文件的大小。 – Suraj 2014-07-23 01:11:03