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

How can i convert java byte array to hexadecimal array in java

我有一个 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};

我想在 ios 应用程序中使用相同的 apdu 命令,使用函数 SCardTransmit

似乎没有问题。 Java看得懂十六进制表示法:写的还行

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

你的问题可能是冒号:

冒号用于 "labeling" 代码,以便 JVM 可以转到该点并保留 运行。也就是说,因为 eg 现在是一个标签,它可以指向 CommandAPU 的 CONSTRUCTOR,它是代码,而不是 CommandAPU(byte[] ) 创建的 OBJECT,它是数据。

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

CommandAPU eg;

然后调用构造函数,构造一个对象。它 returns 一个指向对象在内存中的位置的指针,所以也让 eg 指向那里:

eg = new CommandAPU(stuff);

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

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

也就是说,您似乎可以完全从 Java 进行卡片 IO!多么激动人心。我盲目地爬上 Java Constructor Chain™,这就是我的发现。 深呼吸:

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

再呼吸一次

假设您正确填写了参数并且一百万件事都没有出错,那么您可以使用

myChannel.transmit(eg);

为所欲为。除非您已经拥有相关 CardChannel 的实例。

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