【发布时间】:2012-11-14 11:46:33
【问题描述】:
我使用 netbeans 制作了 java card 经典小程序
当我对读取操作进行编程时,我检查 APDU 中的第一个字节为 0x80,然后第二个字节为0xB0,然后从字节 2 和 3 中获取我将从文件中读取的偏移量,然后获取要从字节 4 读取的字节数
作为默认的APDU
0x80 0xB0 0x00 0x03 0x60 这从当前文件中读取 60 个字节,从偏移量 3 开始
当我尝试这个命令时,它返回错误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 即使在标准中也没有使用
我的问题为什么我必须将命令中的数据设为红色数据的长度
我该如何解决这个错误?
【问题讨论】:
-
你在这方面进展如何,امير طارق?
-
请指出在哪里您收到错误或异常。
-
请注意,您的代码还有很多不足之处,例如多次获取缓冲区,不使用十六进制表示状态字,不使用
ISO7816类作为常量,而是使用data[4]setOutgoing(),并使用硬编码文字而不是常量。您可能会在无处不在(现在稍微过时)Java Card book 中找到很多相关信息
标签: java smartcard javacard apdu