不要重新发明轮子:Java Card API 中有有用的内置静态方法,出于性能原因,通常将其实现为本机函数。你的代码不可能比他们更好。
1)首先,javacardx.framework.util.ArrayLogic.arrayCopyRepackNonAtomic http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacardx/framework/util/ArrayLogic.html是使用 RAM 阵列时所需要的:
ArrayLogic.arrayCopyRepackNonAtomic(b, (short) 0, len, temp_conv, (short) 0);
还有arrayCopyRepack
,这对于持久数组很有用(整个操作在单个事务中完成,但速度有点慢)。
2) 如果您无法使用ArrayLogic
,总有javacard.framework.Util.getShort http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/framework/Util.html#getShort%28byte%5B%5D,%20short%29,您可以使用它来代替按位魔法:
private static final void byteToShort(final byte[] bytes, final short blen, final short[] shorts)
{
short x = 0;
short y = 0;
for (; y < blen; x++, y += 2)
{
shorts[x] = Util.getShort(bytes, y);
}
}
注意还有setShort
,这可能有用short[]
to byte[]
转换。
3)关于代码的一些其他注释,以防您确实想自己实现它:
- Your
aux
存储在持久存储器中。这非常慢,并且可能会损坏您的卡,因为aux
经常被重写,参见EEPROM损坏的症状 https://stackoverflow.com/questions/30636485/symptoms-of-eeprom-damage.
-
b[2*x+j]
没有效果,因为乘法速度慢。您应该使用两个循环变量,并且仅使用加法。
- 摆脱
aux
和内循环,你根本不需要它们
- 关于什么
int len
?没有int
在 Java 卡 2.2.2 中...