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

Sac*_*n D 2 applet byte apdu smartcard javacard

我无法在字节数组中的 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];
}
Run Code Online (Sandbox Code Playgroud)

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

我在用:

  • 智能卡类型 = 联系人卡
  • 使用带有 apdu 的 jcop 的 java 卡 2.2.2

Rob*_*ert 5

您的代码包含几个问题:

  1. 正如 'pst' 已经指出的那样,您使用的有符号byte值只能达到 128 - 使用 ashort代替

  2. Buffer1在每次调用Write1方法时都会创建一个新缓冲区。在 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 );
}
Run Code Online (Sandbox Code Playgroud)