首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JCOP专有方法返回可用内存?

如何使用JCOP专有方法返回可用内存?
EN

Stack Overflow用户
提问于 2015-03-18 15:34:04
回答 2查看 220关注 0票数 2

下面,您可以看到一个程序,该程序用于在接收到任何APDU命令时返回EEPROM可用内存:

代码语言:javascript
复制
public class HelloWorld extends Applet {
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new helloWorld.HelloWorld().register(bArray, (short) (bOffset + 1),
                bArray[bOffset]);
    }

    public void process(APDU apdu) {
        if (selectingApplet()) {
            return;
        }

        getAvailableMem(apdu);

    }

    public void getAvailableMem(APDU apdu){
        byte[] buffer = apdu.getBuffer();
        short[] AvailableMem = {};

        UtilX.getAvailableMemoryInfo(AvailableMem, (short) 0,
                UtilX.MEMORY_TYPE_PERSISTENT);

        for(short i=0;i<(short)AvailableMem.length;i++){
            buffer[i]=(byte)AvailableMem[i];
        }

        apdu.setOutgoingAndSend((short)0, (short)(2*AvailableMem.length));
    }
}

但是,当我向小程序发送APDU命令时,它返回0x6F00

代码语言:javascript
复制
OSC: opensc-tool -s 00a4040006010203040506 -s 00000000
Using reader with a card: ACS CCID USB Reader 0

Sending: 00 A4 04 00 06 01 02 03 04 05 06
Received (SW1=0x90, SW2=0x00)

Sending: 00 00 00 00
Received (SW1=0x6F, SW2=0x00)

请注意,我还使用下面的循环尝试了上面的程序:

代码语言:javascript
复制
for(byte i=0;i<(byte)AvailableMem.length;i++){
                buffer[i]=(byte)AvailableMem[i];
            }

编译成功!编译器不应该将数组索引的类型限制为仅byte或仅short吗?为什么它接受这两种类型的索引?

-This第二个程序在OpenSCTool中有相同的输出。怎么了?

EN

回答 2

Stack Overflow用户

发布于 2015-03-18 19:12:30

您必须将结果存储到现有的非零长度数组中:

代码语言:javascript
复制
class MyApplet extends Applet {

short[] shorts = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_RESET);

public void process(APDU apdu) {
    //...
    UtilX.getAvailableMemoryInfo(shorts, (short)0, UtilX.MEMORY_TYPE_PERSISTENT);
    //...
}

您的状态代码6F00是一个未捕获的ArrayIndexOutOfBoundsException实例。

您可以使用这两种整数类型作为索引:byteshort,没有实际区别(当然,对于长度不超过0x7F的数组)。

票数 2
EN

Stack Overflow用户

发布于 2015-03-19 01:24:51

示例代码取自我的一个applet:

声明放在我的类的开头

代码语言:javascript
复制
    short[] mem = new short[2];

在流程树内部:

代码语言:javascript
复制
case Cmd.GET_FREE_MEM:
                UtilX.getAvailableMemoryInfo(mem, (short) 0, UtilX.MEMORY_TYPE_PERSISTENT);
                Util.setShort(apdu.getBuffer(), (short) 0, mem[0]);
                Util.setShort(apdu.getBuffer(), (short) 2, mem[1]);
                UtilX.getAvailableMemoryInfo(mem, (short) 0, UtilX.MEMORY_TYPE_TRANSIENT_RESET);
                Util.setShort(apdu.getBuffer(), (short) 4, mem[0]);
                Util.setShort(apdu.getBuffer(), (short) 6, mem[1]);
                apdu.setOutgoingAndSend((short) 0, (short) 8);
                break;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29116409

复制
相关文章

相似问题

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