2

5 Kb、7 Kb、11Kbのサイズの異なる3つのファイルを格納するアプレットを作成しています。アプレット内にファイルを保存することに問題はありません。しかし、それらを読み戻そうとすると、最初の2つ(小さいファイル)しか読み取ることができません。3番目のファイルは例外をスローします:

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バイトがアプレットから読み取ることができる最大バイト数であることを意味します。サンプルコードを使用して応答を連鎖させています。

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種類のカードを試しましたが、すべて同じように動作します。

何か助けてください?

4

1 に答える 1

2

ホストアプリケーションは、少なくともISO7816-4で指定されているREADBINARYコマンドで、P1 / P2で開始オフセットを便利に指定できるため、ファイルの読み取りは通常、チェーンを使用して行われません。連鎖応答の場合でも、カードはデータをバッファーに準備したいと考えています。バッファーのサイズが限られていることが、問題の原因であると考えられます。

于 2013-03-27T08:18:58.763 に答える