如何在java中将java字节数组转换为十六进制数组

时间:2017-02-13 20:03:58

标签: java android apdu pcsc

我有一个Android应用程序,它使用字节数组来获取智能卡的APDU命令

eg : new CommandAPDU(new byte[]{(byte)0, (byte)-92, (byte)4,
 (byte)0, (byte)12, (byte)-96, (byte)0, (byte)0, 
(byte)2, (byte)0, (byte)19, (byte)0, (byte)0, (byte)0, (byte)1, (byte)1});

如何将其转换为十六进制数组,如{0x80, 0xCA, 0x9F, 0x7F, 0x00};

我想使用功能SCardTransmit

在ios应用程序中使用相同的apdu命令

1 个答案:

答案 0 :(得分:0)

似乎没有问题。 Java理解十六进制表示法:可以写

eg = new CommandAPU(new byte[] {(byte)0x80, (byte)0xCA, (byte)0x9F, 0x7F, 0x00});

您的问题可能是冒号:

冒号用于“标记”代码,以便JVM可以到达那一点并继续运行。也就是说,因为eg现在是一个标签,它可以指向CommandAPU的CONSTRUCTOR,它是代码,但不是CommandAPU(byte [])所做的OBJECT,它们是数据。

您需要创建一个可以指向CommandAPU对象的变量:

CommandAPU eg;

然后调用构造函数,它构造一个对象。它返回一个指针,该指针指向对象在内存中的位置,因此也可以指向那里:

eg = new CommandAPU(stuff);

您现在可以在任何需要CommandAPU的地方使用。

但是......你想使用SCardTransmit功能,是吗? C#可以很好地处理Windows DLL(或者我已经阅读过了),但是Java显然非常棘手......您可以尝试阅读how to do it all in Java.您可以将字节数组从Java代码移动到C#,但是我认为将完成的对象从JVM移动到外部程序是不合理的。

那说看起来你可以完全用Java做Card IO!多么激动人心。我盲目地跋涉Java Constructor Chain™,这就是我发现的。 深呼吸

myChannel = javax.smartcardio.TerminalFactory.getDefault().terminals().getTerminal(theNameOfTheTerminal).connect(theProtocolToUse).getBasicChannel();

再次呼吸

假设您填写了正确的论据并且有一百万件事情没有出错,那么您可以使用

myChannel.transmit(eg);

做任何事情。除非您已经拥有相关CardChannel的实例。

作为最后一点,本网站旨在成为一个提出新问题的地方,而不是一个论坛。您的问题(或者更确切地说,您的错误)可能已在其他地方得到解决。我知道这可能是令人生畏的,面对庞大的资源,都是用英语写的,但请在到达之前先到别处寻求帮助。祝你好运!