2

我无法在字节数组中的 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

4 回答 4

5

您的代码包含几个问题:

  1. 正如'pst'已经指出的那样,您使用的有符号byte值最多只能工作 128 - 改用shorta

  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 );
}
于 2011-12-12T12:23:17.607 回答
3
short j = (short) apdu_buffer[ISO7816.OFFSET_LC] & 0xFF
于 2012-12-07T09:39:05.900 回答
1

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


在 Java 中 abyte具有范围内的值,[-128, 127]因此,当您说“160”时,这并不是代码真正给您的 :)

也许您想使用:

int j = apduBuffer[4] & 0xFF;

在将原始字节数据视为无符号apduBuffer[4]值的同时将值“向上转换” 。int

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

(我不知道这是否是唯一/真正的问题——或者上述是否是Java Card上的可行解决方案——但它确实是一个问题,并且与提到的“128 限制”一致。)

快乐编码。

于 2011-12-12T07:22:01.520 回答
1

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

于 2011-12-12T07:51:48.657 回答