使用 ACR38 读卡器从 SLE 4442 智能卡读取数据
Posted
技术标签:
【中文标题】使用 ACR38 读卡器从 SLE 4442 智能卡读取数据【英文标题】:Reading data from SLE 4442 smart card using ACR38 Card Reader 【发布时间】:2016-02-27 23:27:53 【问题描述】:我正在开发一个项目,以读取和写入 SLE 4442 智能卡的数据。我使用的读卡器是来自ACS 的 ACR38。按照他们的APDU commands,我可以访问卡并读取一些数据。但我怀疑我仍然无法读取里面的确切数据。这是因为,每当我的应用程序启动时,它都会带出新数据。我真的不知道为什么会这样,有人可以在这里发现哪里出错了吗?以下是我的 Java 代码:
CardChannel channel = card.getBasicChannel();
byte[] read_memory_card = (byte) 0xFF, (byte) 0xB0, (byte) 0xA7A6A5A4, (byte) 0xA3A2A1A0, (byte) 0x00;
ResponseAPDU read_data_resp = channel.transmit(new CommandAPDU(read_memory_card));
if (read_data_resp.getSW1() == 0x90 && read_data_resp.getSW2() == 0x00)
System.out.println("Data in Card: " + read_data_resp.getData() + "and SW1: " + read_data_resp.getSW1());
我得到的结果:卡中的数据:[B@378bf509 和 SW1:144
请注意卡中的数据每次都会更改,应用程序会重新启动。
【问题讨论】:
为什么要将0xA7A6A5A4
转换为一个字节?这只会发送给读者0xA4
。 0xA3A2A1A0
也是如此。此外,您应该将 sw1 输出为十六进制,但您已经知道 sw1 是 0x90,因为您的 if 语句。
@RobertSnyder,我在他们的手册上看到了完全一样的文字。我从来不知道它可以这么容易地压缩。感谢指正
您是否正在查看第 4.6.2 节?如果是这样,那么你做错了。我不确定如何阅读他们的要求,但他们指的是这些位。因此,您要求提供地址1010 0100
,如果我正在阅读文档正确1000 000
具有特殊含义。
我实际上在看第 4.6.2 节,那是适用于我的智能卡类型的那个
Java: Syntax and meaning behind "[B@1ef9157"? Binary/Address?的可能重复
【参考方案1】:
我假设您看到的“不同”数据并不是真正不同,而是您正在打印出 Java 用作默认 toString() 的内存中的指针。我只能假设read_data_resp.getData()
返回一个byte[]
,在这种情况下,如果您想将每个值可视化,您需要将其转换为字符串。如果你在谷歌上搜索如何将字节数组转换为十六进制字符串,你会找到很多答案。
【讨论】:
我添加了这行代码,但没有显示任何内容:byte[] data_read = read_data_resp.getData(); for (int i = 0; i < data_read.length; i++) System.out.printf("%02X ", data_read[i]);
@MrHeart 根据您的信息和文件猜测,您要求从无效或不包含数据的卡中读取地址。以上是关于使用 ACR38 读卡器从 SLE 4442 智能卡读取数据的主要内容,如果未能解决你的问题,请参考以下文章