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

Appending a byte into a byte array in Java Card

我在下面有一个方法可以将单个字节插入字节缓冲区,但在构建和清理 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.

如何解决?

这不是 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 中的所有原始数组没有共同的祖先 class卡片。并非 Java Card 中的所有内容都是 Objectbyte 是原语。那会给你带来麻烦。

Java 卡片构建的第一步是使用普通 Java 编译器创建标准 .class 文件。这个编译器对 Java Card 一无所知,它看到一个 byte 用作 Object,所以它使用自动装箱,将你的 byte 转换为 java.lang.Byte 并且在 .class 文件中添加对 java.lang.Byte 的依赖。到目前为止,一切都很好。这很简单Java,所以它有效。

但是,在 Java 卡片库中 java.lang 包中没有 java.lang.Byte。这会在创建 .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 存储。