2016-02-27 91 views
0

正在处理项目以读取和写入数据到SLE 4442智能卡。我使用的读卡器是ACS的ACR38。在他们的APDU commands之后,我可以访问卡并读取一些数据。但我怀疑我仍然无法读取里面的确切数据。这是因为,无论何时我的应用程序启动,它都会带出新的数据。我真的不知道为什么会出现这种情况,有人可以发现哪里出错了吗?下面是我的Java代码:使用ACR38读卡器从SLE 4442智能卡读取数据读卡器

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

请注意,数据卡每次更改时,应用程序都会重新启动。

+1

你为什么要把'0xA7A6A5A4'作为一个字节?这只会发送读者'0xA4'。 “0xA3A2A1A0”也一样。你也应该输出sw1作为十六进制,但你已经知道sw1是0x90,因为你的if语句。 –

+0

@RobertSnyder,我看到了写在手册上的文字。我从来不知道它可以轻松压缩。感谢您的更正 –

+0

您是否正在查看第4.6.2节的内容?如果是这样,那么你做错了。我不确定如何阅读他们提出的问题,但他们指的是这些位。因此,您要求提供地址1010 1010,如果我正在阅读正确的文件'1000 000'具有特殊含义。 –

回答

1

我假设你看到“不同”的数据并不是真的不同,而是你打印出内存中的Java指针作为默认的toString()。我只能假设read_data_resp.getData()重新调整了byte[],在这种情况下,如果要将其可视化,则需要将每个值转换为字符串。如果你搜索谷歌如何将字节数组转换为十六进制字符串,你会发现很多答案。

+1

我加了下面几行代码,它没有显示任何东西: ' byte [] data_read = read_data_resp.getData(); (int i = 0; i

+1

@MHHART根据您的信息和文档推测,您要求的地址是从无效或不包含数据的卡中读取的。 –