2013-03-26 3 views
2

Я пишу апплет, в котором хранятся 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) совместимые карты, но все они ведут себя так же.

Любая помощь пожалуйста?

ответ

2

Чтение файла, как правило, не выполняется с помощью цепочки, поскольку приложение-хозяин может удобно задать начальное смещение в P1/P2 - по крайней мере, в команде READ BINARY, как указано в ISO 7816-4. Я предполагаю, что даже для цепного ответа карта хочет подготовить данные в буфере, чей ограниченный размер я предполагаю причиной вашей проблемы.

+0

Thanx guidot. Я удалил цепочку и сделал мое приложение для хостинга читать маленькие куски размером 256 байт и каждый раз увеличивать смещение на 256. Он отлично работает. Я даже пытался прочитать файл 20 КБ, и результаты были положительными. Поэтому я предполагаю, что цепочка не может выдерживать очень большие файлы. Я все равно ошибаюсь. – ally

+0

Вы все еще можете использовать APDU с расширенной длиной, чтобы получить большие куски, но поддерживаемый лимит зависит от карты. Меньше команд для отправки означает меньше накладных расходов, поэтому вы можете сэкономить некоторое время, которое может быть связано с 20-битным файлом. – guidot

+0

@ ally, Можете ли вы поделиться кодами со мной Я новичок в Java-карте и имею такую ​​же проблему для хранения файла большего размера. – Suraj

Смежные вопросы