如何在字节Java中发送大于127的值

时间:2014-06-07 07:32:16

标签: java byte smartcard smartcard-reader

我正在使用智能卡,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();构造函数不接受[]。那怎么办呢?

3 个答案:

答案 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上的众多示例之一。