다른 크기 5 Kb, 7 Kb 및 11 Kb의 파일 3 개를 저장하는 애플릿을 작성했습니다. 애플릿 안에 파일을 저장하는 데 아무런 문제가 없습니다. 그러나 내가 그들을 다시 읽으려고 할 때, 처음 두 개 (작은 파일) 만 읽을 수 있습니다. 세 번째 파일은 예외가 발생합니다 : 내가 문제를 알아 내기 위해 노력했다javacard 애플릿에서 큰 파일 읽기
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 바이트는 애플릿에서 읽을 수있는 최대 바이트 수입니다. 나는 샘플 코드를 사용하여 응답 체인 오전 : 나는 JC 2.2.1 (36 KB)와 JC 2.2.2 (80KB) 호환 카드 즉 카드의 두 가지 유형을 시도
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
}
}
을하지만 그들은 모두 동일하게 동작합니다.
도움이 필요하십니까?
고맙습니다. 연결을 제거하고 내 호스트 응용 프로그램에서 256 바이트의 작은 청크를 읽었을 때마다 매번 오프셋을 256 씩 늘립니다. 제대로 작동합니다. 20 Kb 파일을 읽으려고했는데 그 결과는 긍정적이었습니다. 그래서 나는 체인이 매우 큰 파일을 견딜 수 없다고 가정합니다. 어쨌든 나는 틀릴지도 모른다. – ally
더 큰 청크를 얻기 위해 확장 길이 APDU를 시도 할 수도 있지만 지원되는 제한은 카드에 따라 다릅니다. 보내지는 명령어가 적어 짐에 따라 오버 헤드가 적어 지므로 시간을 절약 할 수 있습니다. 20kByte 파일에 대해서는 주목할만한 것입니다. – guidot
@ ally, 나와 코드를 공유 할 수 있습니까? Java 카드를 처음 사용하고 더 큰 크기의 파일을 저장하는 것과 동일한 문제가 있습니다. – Suraj