我编写了一个Java Card小程序,它将一些数据保存到偏移 ISO7816.OFFSET_CDATA
的APDU缓冲区中,并将这些字节作为响应发送 .
Util.arrayCopy(Input_Data, (short)0, buffer, (short) ISO7816.OFFSET_CDATA, (short)Datalength);
apdu.setOutgoing();
apdu.setOutgoingLength((short)(DataLength) );
apdu.sendBytesLong(buffer, ISO7816.OFFSET_CDATA, (short)(DataLength));
我在模拟器中测试了这个没有任何问题 . 但是当我在真正的智能卡(由金雅拓制造的Java Card v2.2.1)上测试时,我得到状态字 0x6180
作为响应 .
我的命令APDU是 00 40 00 00 80 Data
,其中数据长度为128个字节,因此缓冲区中有4个128字节,(260-(4 128))字节为空 .
1 回答
您的模拟器可能使用
T=1
传输协议,但您的真实卡不会 . 它使用T=0
协议,这意味着它可以接收数据,也可以在单个APDU中发送数据 .状态字
0x6180
表示从卡接收0x80
个字节 . 通常,61XX
表示要接收XX
个字节 .怎么收到它们?好吧,有一个名为
GET RESPONSE
的特殊APDU命令 . 每次收到61XX
状态字时都应该调用它 . 使用XX
作为GET RESPONSE
APDU的Le
字节关于您的代码的一些其他说明:
Datalength
vsDataLength
?将输出数据复制到
0
而不是ISO7816.OFFSET_CDATA
为什么每次都将
DataLength
投射到short
?是short
?不要施放然后 . 是byte
?然后你以错误的方式抛出它,因为无符号字节值> 0x80
将被强制转换为负short
. 从无符号byte
到short
的正确转换是(short) (DataLength & 0xFF)
尽可能使用
setOutgoingAndSend
. 它简单得多 .只要不复制到持久数组,就使用
arrayCopyNonAtomic
而不是arrayCopy
.arrayCopyNonAtomic
的表现要好得多 .