从 Read Block APDU 命令 smartcardio 检索和显示值

Posted

技术标签:

【中文标题】从 Read Block APDU 命令 smartcardio 检索和显示值【英文标题】:Retrieving and displaying value from Read Block APDU command smartcardio 【发布时间】:2014-01-20 14:27:33 【问题描述】:

我正在开发一个基于 RFID 的考勤监控系统。我使用 Mifare 1k Classic 作为我的 RFID 和 ACR122u 作为我的阅读器。我了解到您可以使用 STORE VALUE BLOCK APDU 命令将值存储到卡中,也可以使用 READ BLOCK APDU 命令读取。两个命令都返回 0x90 SW1,表示传输成功。我的问题是如何在读取后获取/检索存储到 VALUE BLOCK 的值。例如,我从块 0x05 中存储了一个值“15”。现在我尝试从块 0x05 中获取值“15”。我在这里尝试了这些代码:

CommandAPDU comm1 = new CommandAPDU(new byte[] (byte) 0xFF,(byte) 0xB1,(byte) 0x00,(byte) 0x05,(byte) 0x04);
ResponseAPDU read1 = channel.transmit(comm1);

它成功读取了块,但它不显示值。我尝试使用:

System.out.println(read1.getBytes());
System.out.println(read1.getData());

但两者都显示一些随机输出,例如:[B@140fee

谁能帮我解决这个问题?输出是什么意思?

【问题讨论】:

【参考方案1】:

输出[B@140fee由对象的toString()方法生成(使用println()方法打印任意对象时会隐式调用该方法。[表示该对象是数组类型对象。@987654325 @ 表示数组的元素类型是Byte@ 符号后面的十六进制数字是对象的哈希码的十六进制表示(对象的hashCode() 方法返回的任何数字。

因此,为了查看您收到的字节,您需要将字节数组转换为可读的字符串表示形式(例如,每个字节值的串联十六进制表示形式)。

【讨论】:

谢谢!这很有帮助。我真的对getBytes() 的输出一无所知。但是是否有可能从Read Value Block APDU 命令得到Read Value Reponse Format?例如我存储了一个值“15”来阻止编号。 5. 所以APDU命令是FF B1 00 05 04,响应应该是00 00 00 0F 90 00。如何使用 java 获得此响应?我阅读了 ACS ACR122U API 手册。

以上是关于从 Read Block APDU 命令 smartcardio 检索和显示值的主要内容,如果未能解决你的问题,请参考以下文章

APDU 命令读取 SLE4432/42 卡

如何将任何 APDU 命令从当前选定的小程序传递到另一个小程序?

如何使用 APDU 命令从 PoS 终端读取 MCC 代码

发送 APDU 命令以读取被动标签?

APDU 命令将更改的 PIN 写入卡

APDU MIFARE Classic 4K 读取特定扇区/块的值