我无法在字节数组中以高于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(这意味着到达文件结束)。
我正在使用:
答案 0 :(得分:4)
您的代码包含几个问题:
正如'pst'已经指出的那样,您使用的签名byte
值最多只能使用128 - 使用short
代替
您正在为Buffer1
方法的每次调用创建一个新的缓冲区Write1
。在JavaCard上通常没有自动垃圾收集 - 因此内存分配应该只在安装应用程序时完成一次。如果您只想处理adpu缓冲区中的数据,请从那里使用它。如果您想将数据从一个字节数组复制到另一个字节数组,请更好地使用javacard.framework.Util.arrayCopy(..)
。
您正在调用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 );
}
答案 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,依此类推。