applet - 如何在JavaCard中存储大于128字节的数据

标签 applet byte smartcard javacard apdu

我无法将数据写入字节数组中索引高于 128 的位置。 代码如下。

private void Write1(APDU apdu) throws ISOException
{
    apdu.setIncomingAndReceive();
    byte[] apduBuffer = apdu.getBuffer();
    byte j = (byte)apduBuffer[4];       // Return incoming bytes lets take 160
    Buffer1 = new byte[j];              // initialize a array with size 160
    for (byte i=0; i<j; i++)
        Buffer1[(byte)i] = (byte)apduBuffer[5+i];
}

它给我错误 6F 00(这意味着到达文件末尾)。

我正在使用:

  • 智能卡类型=接触卡
  • 使用 java card 2.2.2 和 jcop 使用 apdu

最佳答案

您的代码包含几个问题:

  1. 正如“pst”所指出的,您使用的是带符号的 byte 值,该值最多只能达到 128 - 请改用 short

  2. 每次调用 Write1 方法时,您都会创建一个新缓冲区 Buffer1。在 JavaCard 上通常没有自动垃圾收集 - 因此内存分配应该只在安装应用程序时进行一次。如果您只想处理 adpu 缓冲区中的数据,只需从那里使用它。如果您想将数据从一个字节数组复制到另一个字节数组,最好使用 javacard.framework.Util.arrayCopy(..)

  3. 您正在调用 apdu.setIncomingAndReceive(); 但忽略返回值。返回值为您提供了您可以读取的数据字节数。

以下代码来自API文档,展示了常用的方式:

short bytesLeft = (short) (buffer[ISO7816.OFFSET_LC] & 0x00FF);
if (bytesLeft < (short)55) ISOException.throwIt( ISO7816.SW_WRONG_LENGTH );
short readCount = apdu.setIncomingAndReceive();
while ( bytesLeft > 0){

     // process bytes in buffer[5] to buffer[readCount+4];

     bytesLeft -= readCount;
     readCount = apdu.receiveBytes ( ISO7816.OFFSET_CDATA );
}

关于applet - 如何在JavaCard中存储大于128字节的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8470992/

相关文章:

java - 将 png 图像添加到 java 小程序

java - JSE 1.8,通过 HTTPS 加载的沙盒 Java Applet,但使用 HTTP 检索 crossdomain.xml

Java Applet - "Block potentially unsafe components from being run?"消息

Linux命令从tar中提取单个文件作为字节/字节数组

python - 在 Linux 中使用 ACS ACR1252U USB NFC 读卡器

.net - 清除 PIN 缓存智能卡

java - 在小程序中运行桌面应用程序是否更安全?

C++ 在字节 vector 和 wstring 之间转换

python 将负整数转换为字节(singed=True),但转换回来,它变成正数

authentication - 使用USB token 或智能卡上的数字签名证书从浏览器进行用户身份验证