我正在编写一个applet,存储3个不同大小的文件,分别为5 Kb,7 Kb和11 Kb。将文件存储在applet中我没有任何问题。但是当我尝试回读它们时,我只能读取前两个(较小的文件)。 第三个文件抛出异常:
javax.smartcardio.CardException: Could not obtain response
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source)
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source)
我试图弄清楚问题,我发现它与文件的大小有关。所以我创建了一个大小为7 Kb的测试文件,并逐位递增这个文件。 它一直工作,直到我达到7905字节。这意味着7905字节是我可以从applet读取的最大字节数。 我正在使用示例代码链接响应:
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)兼容卡,但它们的行为都相同。
请帮忙吗?
答案 0 :(得分:2)
通常不使用链接来读取文件,因为主机应用程序可以方便地指定P1 / P2中的起始偏移 - 至少在ISO 7816-4中指定的READ BINARY命令中。我假设,即使对于链式响应,卡也希望在缓冲区中准备数据,我认为这有限的大小是您遇到问题的原因。