我最近买了一个智能卡读卡器(Gemplus USB智能卡读卡器),里面有一些卡。我一直在阅读一些关于如何使用它们的教程,但我有几个问题。我正在尝试与智能卡通信(发送APDU),但没有成功。我在虚拟智能卡上安装了一个小程序(使用Netbeans)。
我的处理方法是这样的:
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
if (CLA != HW_CLA){
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (INS) {
case HW_INS_ADD:
add(apdu);
break;
case HW_INS_SUBTRACT:
subtract(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
add
和subtract
方法在声明的变量(balance)上增加或减去5个单位。我想在做手术后把余额存到卡上。有人知道我怎么把这个值写进卡吗?如果可能的话,我之前怎么读?
感谢任何帮助。谢谢你。
在Applet 实例被删除之前,持久化(持久化内存意味着EEPROM或flash)字段中的任何状态都将被保留。非瞬态数组元素中的状态也是如此。当然,要做到这一点,您需要保留对数组的持久引用。瞬态(瞬态意味着RAM) CLEAR_ON_DESELECT
数组的内容将被清除一旦上下文切换,例如,当另一个Applet被选中时(当前一个被取消选中)或当软复位或硬复位发生时。当然,CLEAR_ON_RESET
阵列只会在重置(包括断电)时被擦除。
基本上所有对象实例都驻留在持久内存中,这意味着使用new
创建的任何对象实例。对于平台创建的任何对象,如果API没有显式指定结果是临时的,也会出现这种情况。每次调用process
方法时,APDU缓冲区本身都会被清除。
如果您想要存储像余额这样的东西,您需要了解Java Card事务机制,特别是如果您的操作不是原子的。
注意,当包含模拟器的进程结束时,许多Java Card 模拟器不保留任何状态。
答案很简单:只需将字段添加到JavaCard applet类中。一旦"启动",Javacard小程序就会"运行",直到它们被卸载。
当然,"运行"是错误的术语-它们保持其内部状态,如果接收到下一个APDU,则之前APDU的状态仍然存在,即使在接收到第一个APDU后将卡从智能卡读卡器中取出。
实际上你正在保存这些值:)被声明为瞬态或局部变量的值不存储在EEPROM中,否则所有值都存储在EEPROM中,并且是非易失性的。您可以在移除后插入卡片后访问它们。
但是从你发布的代码,我不能说你正在使用什么类型的变量。如果你想要一个精确的答案,只需张贴完整的代码,然后我们会准确地回答你。