Я пишу апплет, в котором хранятся 3 файла разного размера 5 Kb, 7 Kb и 11 Kb. У меня нет проблем с хранением файлов внутри апплета. Но когда я пытаюсь их прочитать, я могу читать только первые два (более мелкие файлы). Третий файл бросает исключение:Чтение большого файла из апплета javacard
javax.smartcardio.CardException: Could not obtain response
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source)
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source)
Я попытался выяснить проблемы, и я узнал, что это связано с размером файла. Поэтому я создал тестовый файл размером 7 Кбайт и поэтапно увеличил этот файл. Он работал, пока я не достиг 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 КБ, и результаты были положительными. Поэтому я предполагаю, что цепочка не может выдерживать очень большие файлы. Я все равно ошибаюсь. – ally
Вы все еще можете использовать APDU с расширенной длиной, чтобы получить большие куски, но поддерживаемый лимит зависит от карты. Меньше команд для отправки означает меньше накладных расходов, поэтому вы можете сэкономить некоторое время, которое может быть связано с 20-битным файлом. – guidot
@ ally, Можете ли вы поделиться кодами со мной Я новичок в Java-карте и имею такую же проблему для хранения файла большего размера. – Suraj