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)兼容卡,但它們都具有相同的行爲。
請幫忙嗎?
Thanx guidot。我刪除了鏈接,並讓我的主機應用程序讀取256個字節的小塊,每次將偏移量增加256.它工作正常。我甚至試圖讀取一個20 Kb的文件,結果是積極的。所以我假設鏈接不能承受非常大的文件。無論如何,我都是錯的。 – ally 2013-03-27 23:08:50
您可能仍會嘗試擴展長度的APDU以獲得更大的塊,但支持的限制取決於卡。更少的命令發送意味着更少的開銷,所以你可以節省一些時間,這可能是一個20 KByte文件通知。 – guidot 2013-03-28 07:36:21
@盟友,你可以與我分享代碼我是新來的Java卡,並有相同的問題存儲更大的文件的大小。 – Suraj 2014-07-23 01:11:03