我编写了一个Java Card小程序,该程序将一些数据以偏移量保存到APDU缓冲区中ISO7816.OFFSET_CDATA
,并将这些字节作为响应发送。
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))字节为空。
您的模拟器可能使用T=1
传输协议,但是您的真实卡却没有。它使用T=0
协议,这意味着它可以在单个APDU中接收数据或发送数据。
状态字0x6180
表示0x80
要从卡中接收字节。通常,61XX
表示XX
要接收的字节。
如何接收它们?好吧,有一个特殊的APDU命令称为GET RESPONSE
。每当您收到61XX
状态字时,都应该调用它。使用XX
为Le
您的字节GET RESPONSE
APDU
APDU -> 61 XX
00 C0 00 00 XX -> your data 90 00
有关代码的其他一些注意事项:
Datalength
与DataLength
?0
而不是ISO7816.OFFSET_CDATA
DataLength
以short
每次?是short
吗 那就不要投。是byte
吗 然后,您以错误的方式进行了强制转换,因为无符号字节值> 0x80
将被强制转换为负数short
。从无符号byte
到a的正确转换short
是(short) (DataLength & 0xFF)
setOutgoingAndSend
尽可能使用。这要简单得多。arrayCopyNonAtomic
而不是arrayCopy
在不复制到持久性阵列时使用。的性能arrayCopyNonAtomic
要好得多。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句