如果buffer[ISO7816.OFFSET_LC]
为>=3
,我想知道如何通过APDU命令发送数据。
其实我正在使用
if (numBytes == 1) {
shortAmount = (short) buffer[ISO7816.OFFSET_CDATA];
} else if (numBytes == 2) {
shortAmount = (short) Util.getShort(buffer, ISO7816.OFFSET_CDATA);
} else if(numBytes == 3) {
//how to get the all data contained in the APDU?
}
答案 0 :(得分:4)
对于大多数Java Card实现,不支持int
基类型。这意味着您不能在一个变量中存储超过16位。
然而,您可以将其存储在数组中。并且 - 当你想到它 - 它已经是。 APDU缓冲区只不过是瞬态存储器中的字节数组(通常是RAM)* 1.
因此,如何处理APDU缓冲区中的APDU数据取决于您:
new byte[size]
的EEPROM / Flash)或瞬态内存(RAM,通过JCSystem.makeTransientByteArray()
)Util.getShort()
将其转换为短片,并将结果存储在类似于字节数组的short
数组中; Key#setValue
命令之一,OwnerPIN#check()
,签名验证等等。或者您可以执行上述任意组合。
如果要使用较大的值执行计算,则必须实现这些计算或访问特殊库。对于32位整数计算,请查看at my X-mas special answer。这也表明,即使您必须自己实现,也可以对数据进行任何类型的计算。 Java Card是图灵完备的,所以只要你没有耗尽CPU时间或内存,就可以对其进行任何可能的计算。
* 1好的,APDU缓冲区是Java Card系统处理它的一种相当特殊的数组,但在处理数据时它只是一个普通的Java Card字节数组。
答案 1 :(得分:1)
将数据存储到字节数组中。
关键是,如果数据大小为> = 3,则需要将数据处理为字节数组。但是,对于处理,您可以开发自己的API,也可以使用可用的API。
答案 2 :(得分:0)
如果要将通过APDU发送的数据解释为整数(== 4个字节),则需要将数据存储到字节数组中。现在,根据用例,您可以使用“Maarten Bodewes”提供的JCInteger类来进一步处理数据。
关键是,如果数据大小为> = 3,则需要将数据处理为字节数组。但是,对于处理,您可以开发自己的API,也可以使用可用的API。