2

我最近买了一个智能卡读卡器(Gemplus USB Smart Card Reader),它带有一些卡。我一直在阅读有关如何使用它们的几个教程,但我有几个问题。我正在尝试与智能卡通信(发送 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);
    }

addandsubtract方法为声明的变量(余额)添加或减去 5 个单位。我想在进行操作后将余额值保存到卡中。有谁知道我怎样才能将该值写入卡中?如果可能的话,我以前怎么读?

感谢任何帮助。谢谢你。

4

3 回答 3

2

持久性(持久性内存意味着 EEPROM 或闪存)字段中的任何状态都将保留,直到 Applet实例被删除。非瞬态数组元素中的状态也是如此。当然,您需要保留对数组的持久引用才能做到这一点。CLEAR_ON_DESELECT一旦进行了上下文切换,例如当另一个小程序被选中(并且当前一个被取消选择)或发生软或硬复位时,瞬态(瞬态意味着 RAM)数组的内容将被清除。当然,CLEAR_ON_RESET阵列只会在重置时被擦除(包括断电)。

基本上所有对象实例都存在于持久内存中,这意味着任何使用new. 对于由 API 未明确指定结果是瞬态的平台创建的任何对象也是如此。每次调用该方法时,总是清除APDU 缓冲区本身。process

如果您想存储余额之类的东西,您需要了解 Java Card 事务机制,尤其是在您的操作不是原子操作的情况下。

请注意,当包含模拟器的进程结束时,许多 Java Card模拟器 不会保留任何状态。这并不能很好地表示真正的 Java Card 实现的行为方式。

于 2013-01-23T23:32:01.213 回答
2

答案很简单:只需将字段添加到您的 JavaCard 小程序类。一旦“启动”Javacard 小程序“运行”,直到它们被卸载。

当然,“运行”是错误的术语——它们保持其内部状态,如果接收到下一个 APDU,则之前来自 APDU 的状态仍然存在,即使在接收到第一个 APDU 后卡已从智能卡读卡器中取出。

于 2013-01-23T10:15:06.057 回答
0

实际上,您正在保存这些值 :) 声明为瞬态或局部变量的值不存储在 EEPROM 中,否则所有值都存储在 EEPROM 中并且是非易失性的。取出卡后,您可以在插入卡时访问它们。

但是从您发布的代码中,我无法说出您使用的是什么类型的变量。如果您想要一个精确的答案,只需发布​​完整的代码,那么我们将准确回答您。

于 2013-02-12T11:41:59.003 回答