在Java Card中将字节附加到字节数组中

时间:2015-09-25 04:20:59

标签: byte javacard

我有一个方法将单个字节插入字节缓冲区,在构建和清理Java Card CAP文件期间,它会抛出错误。

代码:

private void appendOutputBuffer(byte msg) {
    ArrayLogic.arrayCopyRepack(msg, (short) 0, (short) 0, outputBuffer, (short) outputBuffer.length);
}

错误:

error: line 163: sctest: class java.lang.Byte not found in export file lang.exp.
error: line 163: sctest: method valueOf(byte) of class java.lang.Byte not found in export file lang.exp or the method signature has changed.
error: line 163: sctest: class java.lang.Byte not found in export file lang.exp.
error: line 163: sctest: class java.lang.Byte in return type of method java.lang.Byte.valueOf(byte) not found.

我该如何解决?

1 个答案:

答案 0 :(得分:5)

这不是arrayCopyRepack的工作原理。阅读文档:http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacardx/framework/util/ArrayLogic.html#arrayCopyRepack%28java.lang.Object,%20short,%20short,%20java.lang.Object,%20short%29

它的签名是:

public static final short arrayCopyRepack(Object src,
                                          short srcOff,
                                          short srcLen,
                                          Object dest,
                                          short destOff)

但是src参数意味着是一个数组 - 它只是一个Object,因为Java Card中的所有原始数组都没有共同的祖先类。并非Java Card中的所有内容都是Objectbyte是原始的。这会引起你的麻烦。

Java Card构建的第一步是创建标准.class文件的常见Java编译器。此编译器对Java Card一无所知,它看到byte用作Object,因此它使用自动装箱,将byte强制转换为java.lang.Byte并添加依赖关系java.lang.Byte文件中的.class。到现在为止还挺好。这只是普通的Java,所以它可以工作。

但是,在Java Card库中,java.lang.Byte包中没有java.lang。这会在创建.cap文件时导致错误。

将一个字节附加到现有数组(从而创建一个新数组)是一个非常糟糕的主意,顺便说一下。您应该创建buffer足够长的时间并存储有效长度(缓冲区的已使用部分有多长):

private static final short BUF_LEN = (short) 256;
byte[] outputBuffer = new byte[BUF_LEN];
...

private void appendOutputBuffer(byte msg) {
    if (effectiveLen == BUF_LEN)
         ISOException.throwIt(ISO7816.SW_UNKNOWN);
    outputBuffer[effectiveLen] = msg;
    ++effectiveLen;
}

并考虑outputBuffereffectiveLen的RAM与EEPROM存储。