首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SmartCard发送/接收数据

从SmartCard发送/接收数据
EN

Stack Overflow用户
提问于 2013-01-22 18:03:31
回答 3查看 1.4K关注 0票数 2

我最近买了一个智能卡阅读器(Gemplus USB智能卡阅读器),它与一些卡一起。我已经阅读了几个关于如何使用它们的教程,但我有几个问题。我正在尝试与智能卡通信(发送APDU),但没有成功。我在虚拟智能卡中安装了一个applet (使用Netbeans)。

我的process方法是这样的:

代码语言:javascript
复制
    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);
    }

addsubtract方法向已声明的变量(balance)加或减5个单位。我想在进行操作后将余额值保存到卡中。有人知道如何将该值写入卡中吗?如果可能的话,我怎么才能在之前读到它呢?

感谢任何人的帮助。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-24 07:32:01

在删除小程序实例之前,永久(永久内存意味着EEPROM或闪存)字段中的任何状态都将一直保留。对于非瞬态数组元素中的状态也是如此。当然,在这种情况下,您需要保留对数组的持久引用。一旦进行上下文切换,例如,当选择另一个小程序(以及取消选择当前小程序)或发生软或硬重置时,瞬态(瞬态表示随机存取存储器) CLEAR_ON_DESELECT数组的内容将被清除。当然,CLEAR_ON_RESET阵列只会在重置时擦除(包括断电)。

基本上,所有对象实例都驻留在永久内存中,这意味着使用new创建的任何对象实例。这也适用于由平台创建的任何对象,其中API没有显式指定结果是瞬态的。每次调用process方法时,APDU缓冲区本身都会被清除。

如果您希望存储诸如余额之类的内容,则需要了解Java Card事务机制,特别是当您的操作不是原子操作时。

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

票数 2
EN

Stack Overflow用户

发布于 2013-01-23 18:15:06

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-12 19:41:59

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

但从您发布的代码中,我不能说出您使用的是哪种类型的变量。如果你想要一个准确的答案,只需张贴完整的代码,然后我们将准确地回答你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14455887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档