我最近买了一个智能卡阅读器(Gemplus USB智能卡阅读器),它与一些卡一起。我已经阅读了几个关于如何使用它们的教程,但我有几个问题。我正在尝试与智能卡通信(发送APDU),但没有成功。我在虚拟智能卡中安装了一个applet (使用Netbeans)。
我的process方法是这样的:
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个单位。我想在进行操作后将余额值保存到卡中。有人知道如何将该值写入卡中吗?如果可能的话,我怎么才能在之前读到它呢?
感谢任何人的帮助。谢谢。
发布于 2013-01-24 07:32:01
在删除小程序实例之前,永久(永久内存意味着EEPROM或闪存)字段中的任何状态都将一直保留。对于非瞬态数组元素中的状态也是如此。当然,在这种情况下,您需要保留对数组的持久引用。一旦进行上下文切换,例如,当选择另一个小程序(以及取消选择当前小程序)或发生软或硬重置时,瞬态(瞬态表示随机存取存储器) CLEAR_ON_DESELECT数组的内容将被清除。当然,CLEAR_ON_RESET阵列只会在重置时擦除(包括断电)。
基本上,所有对象实例都驻留在永久内存中,这意味着使用new创建的任何对象实例。这也适用于由平台创建的任何对象,其中API没有显式指定结果是瞬态的。每次调用process方法时,APDU缓冲区本身都会被清除。
如果您希望存储诸如余额之类的内容,则需要了解Java Card事务机制,特别是当您的操作不是原子操作时。
请注意,当包含模拟器的进程结束时,许多Java Card 模拟器不会保持任何状态。这并不能很好地表示真正的Java Card实现的行为。
发布于 2013-01-23 18:15:06
答案很简单:只需将字段添加到JavaCard小程序类中。一旦“启动”,Javacard小程序就会“运行”,直到它们被卸载。
当然,“运行”是错误的术语-它们保持其内部状态,并且如果接收到下一个APDU,则即使在接收到第一个APDU之后从智能卡读取器移除了卡,之前来自APDU的状态仍然存在。
发布于 2013-02-12 19:41:59
实际上,您正在保存这些值:)声明为瞬态或局部变量的值不会存储在EEPROM中,否则所有的值都会存储在EEPROM中,并且将是非易失性的。您可以在取出卡后插入卡时访问它们。
但从您发布的代码中,我不能说出您使用的是哪种类型的变量。如果你想要一个准确的答案,只需张贴完整的代码,然后我们将准确地回答你。
https://stackoverflow.com/questions/14455887
复制相似问题