【问题标题】:How can i convert java byte array to hexadecimal array in java如何在java中将java字节数组转换为十六进制数组
【发布时间】:2017-07-01 22:35:30
【问题描述】:

我有一个 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命令

【问题讨论】:

  • 据我所见,这与C#无关
  • @rakeb.mazharul 请看一下
  • 除非他在评论线程中,否则这不起作用......
  • @BradleyDotNET 好的
  • @BradleyDotNET 你知道我可以将字节数组转换为十六进制数组吗

标签: java android apdu pcsc


【解决方案1】:

似乎没有问题。 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 指向那里:

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 的实例。

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

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2013-04-07
    • 2013-10-27
    • 2020-08-02
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多