我正在使用智能卡,javax.smartcardio.CommandAPDU
中有一个方法。
CommandAPDU(int cla, int ins, int p1, int p2, byte[] data, int ne)
我需要以byte[]
(第五个参数)发送数据。现在我的问题是,当Java原始数据类型被签名时,一个字节的最大值不能超过127.我需要发送一个大于127的值。准确地说,十六进制值94
等于148.
正如某些解决方案所示,我们可以将其转换为整数。
byte b = -108;
int i = b & 0xff;
我不能这样做,因为CommandAPDU();
构造函数不接受[]
。那怎么办呢?
答案 0 :(得分:3)
根据智能卡的解释方式,您只需发送正确的负值即可。如果智能卡将值解释为无符号,则可以例如发送-1为255。
答案 1 :(得分:3)
您使用无符号字节计算APDU,而Java使用带符号字节。
只是解释数据的方式,向智能卡发送-108的方式与使用无符号字节从平台发送148的方式完全相同。位组合完全相同。
Java甚至可以自行进行转换,以便您可以使用无符号数字编写代码;
byte data = (byte)0x94; // stores -108 in "data", which will be interpreted
// as 148 on an unsigned platform
答案 2 :(得分:0)
对于长数据块,最好使用十六进制编码器/解码器。但请确保您在内部将数据作为字节处理(直接解码并且不回溯到十六进制String
)。 Apache编解码器库包含一个好的编码器/解码器,或者您可以使用Bouncy Castle或Guava或使用SO上的众多示例之一。