netbeansを使ってJavaカードクラシックアプレットを作りました
読み取り操作をプログラムするとき、APDU の最初のバイトが 0x80 であることを確認し、次に0xB0
、バイト 2 と 3 からファイル内で読み取るオフセットを取得し、読み取るバイト数を取得します。バイト4から
デフォルトのものとしてAPDUになる
0x80 0xB0 0x00 0x03 0x60
これは、オフセット番号3から始まる現在のファイルから60バイトを読み取ります
このコマンドを試すと、エラーが返されましInput data length != Lc around line 12
た。
再試行した後、問題が見つかりました
問題は、コンパイラがバイト 4 がデータの長さであると想定しているため、コマンドで 60 バイトを待機することです。
検索すると、バイト4は送信データ長を意味しないことがわかりました。INS=B0
なぜこのようになったのかわかりません。コンパイラをデバッグしようとすると、プロセス関数にも入りませんでした。
私のスクリプトファイルは
0x00 0xA4 0x04 0x00 0X06 0X87 0XF1 0X3F 0X5E 0X22 0X47 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x3F 0x00 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x50 0x15 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x53 0x00 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x50 0x31 0x7F;
0x80 0xB0 0x00 0x00 0x33 0x7F ;
powerdown;
読み取り機能は
void read(APDU apdu)
{
if(current.isDF())//can not read DF file
{
ISOException.throwIt((short)27014);
}
EFile f = (EFile)current;
byte[]data=apdu.getBuffer();
short offset = Util.getShort(data, (short)2);
if(offset < 0 || offset > f.length)//can not read
{
ISOException.throwIt((short)27270);
}
data=apdu.getBuffer();
short len = (short)(data[4]&0xFF);
if(offset + len > f.length)//can not read
{
ISOException.throwIt((short)26368);
}
apdu.setOutgoing();
apdu.setOutgoingLength(len);
apdu.sendBytesLong(f.data, (short)(f.offset + offset),len);//return the data
}
最初にプログラムを選択してからファイルを選択し、機能しないデータを読み取ろうとする
しかし
、標準でも0x80 0xB0 0x00 0x00 0x02 0x00 0x00
ファイナルは使用されていませんが、オフセット0から2バイトの書き込みを読み取ると0x00 0x00
なぜ私がしなければならないのか私の問題ですが、コマンドのデータは、データの長さが赤である必要がありました
このエラーを修正するにはどうすればよいですか?