我有一个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命令
似乎没有问题。Java理解十六进制表示法:编写是可以的
eg = new CommandAPU(new byte[] {(byte)0x80, (byte)0xCA, (byte)0x9F, 0x7F, 0x00});
你的问题可能是结肠:
冒号用于"标记"代码,这样JVM就可以到达那个点并继续运行。也就是说,因为eg现在是一个标签,它可以指向CommandAPU的CONSTRUCTOR,这是代码,但不能指向CommandAPU生成的OBJECT(byte[]),这是数据。
您需要的是生成一个可以指向CommandAPU对象的变量:
CommandAPU eg;
然后调用构造函数,该构造函数生成一个对象。它返回一个指向对象在内存中位置的指针,所以也要指向那里:
eg = new CommandAPU(stuff);
你现在可以在任何需要CommandAPU的地方使用。
然而。。。您想使用SCardTransmit功能,是吗?C#可以很好地处理Windows DLL(或者我读过),但Java显然很棘手。。。您可以尝试阅读如何用Java完成这一切。您可以将字节数组从Java代码移动到C#,但我认为将已完成的对象从JVM移动到外部程序是不明智的。
也就是说,看起来你可以完全从Java中完成Card IO!多么令人兴奋。我盲目地在Java构造函数链上跋涉™,这就是我的发现深呼吸:
myChannel = javax.smartcardio.TerminalFactory.getDefault().terminals().getTerminal(theNameOfTheTerminal).connect(theProtocolToUse).getBasicChannel();
再次呼吸
假设你把论点填对了,一百万件事都没有出错,那么你就可以使用
myChannel.transmit(eg);
做任何事。除非您已经拥有相关CardChannel的实例。
最后,这个网站是一个提出新问题的地方,而不是一个论坛。你的问题(或者更确切地说,你的错误)很可能已经在其他地方解决了。我知道面对巨大的资源墙可能会很吓人,这些资源都是用英语写的,但在来这里之前,请先在其他地方寻求帮助。祝你好运