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

时间:2011-12-12 07:10:25

标签: 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卡2.2.2和jcop使用apdu

4 个答案:

答案 0 :(得分:4)

您的代码包含几个问题:

  1. 正如'pst'已经指出的那样,您使用的签名byte值最多只能使用128 - 使用short代替

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

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

  4. 以下代码来自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 );
    }
    

答案 1 :(得分:3)

short j = (short) apdu_buffer[ISO7816.OFFSET_LC] & 0xFF

答案 2 :(得分:1)

更新:虽然以下答案对普通Java“有效”,但请参阅Roberts答案,了解Java Card特定信息以及其他问题/方法。


在Java中,byte的值在[-128, 127]范围内,因此,当您说“160”时,不是代码实际上给您的内容:)

也许您想使用:

int j = apduBuffer[4] & 0xFF;

将原始字节数据视为无符号值时,将apduBuffer[4]值“转发”到int

同样,i也应该是int(以避免令人讨厌的溢出循环错误),System.arraycopy方法也可以方便...

(我不知道这是否是唯一/真正的问题 - 或者如果以上是Java Card上的可行解决方案 - 但它肯定是 问题并且对齐提到“128限制”。)

快乐的编码。

答案 3 :(得分:1)

阐述pst的答案。一个字节有2 ^ 8位数字,或者更确切地说是256位。但是如果你使用有符号数字,它们将在一个循环中工作。因此,128实际上是-128,129将是-127,依此类推。