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