Fug*_*gue 1 format android nfc mifare contactless-smartcard
当用Android读取MIFARE卡并将数据转换为UTF-8时,我会收到类似 的奇怪字符.我正在尝试构建一个可以读取我们正在使用的某种身份证的应用程序.现在的问题是,我在单词之间得到奇怪的字符,有些单词在块之间分开,那么我怎样才能安全地得到一个我正在寻找的单词呢?例如,我的读数是这样的:
43224 19032019 第2块sektor 2 bindex:8
并且在拆分时,从19开始的数字的其余部分位于新块:
meName M 19
在块1 sektor 1 bindex:4
930402NO934951
在块2 sektor 1 bindex:4
c5 42 4e 49 44 00 07 4f 4f 4f 4f 4f 4f 00 4b 42 "Åbnid" "OOOOOO" "KB" 44 44 44 20 44 44 44 44 44 00 82 4d 00 c9 31 39 "DDD DDDDD" "M" "19" 39 34 34 33 34 32 00 d0 4e 4f 39 36 36 36 35 31 "944342" "NO966651" 00 00 00 00 00 00 70 f7 88 00 00 00 00 00 00 00 30 32 32 20 20 41 53 00 d3 54 4f 54 41 4c 20 4b "022" "AS" "Total k" 4f 4e 54 52 4f 4c 4c 20 41 53 20 00 c9 30 32 38 "ONTROLL AS" "028" 37 30 34 33 33 00 c9 32 30 32 31 30 32 31 31 00 "70433" "20210211" 00 00 00 00 00 00 70 f7 88 00 00 00 00 00 00 00
这是我从卡片中读取的内容:
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
MifareClassic mfc = MifareClassic.get(tagFromIntent);
Run Code Online (Sandbox Code Playgroud)
这是我用于在for循环中读取的代码:
data = mfc.readBlock(bIndex + block);
Run Code Online (Sandbox Code Playgroud)
然后将数据转换为UTF8进行打印我使用:
public String convertByteArrayToUTF8(byte[] bytes){
String encoded = null;
try {
encoded = new String(bytes, StandardCharsets.UTF_8);
}
catch (Exception e){
encoded = new String(bytes, Charset.defaultCharset());
}
return encoded;
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用ASCII,UTF-16等没有运气.
首先是问题标题的LOL.当我是新手时,我处于同样的境地.没有在线教程为您提供从Mifare经典卡读取数据的确切代码.
首先要了解Mifare卡的内存结构.
Mifare Classic的内存分为扇区,也分为16个字节的块.
MIFARE Classic 1K卡有16个扇区,每个扇区分为4个区块.如果我们进行数学计算,我们可以弄清楚内存结构是怎样的:16个字节(1个块)*4个块*16个扇区= 1024个字节.
MIFARE Classic 4K卡有40个扇区,其中32个分为4个块,其余8个分为16个块.16字节(1个块)*4个块*32个扇区+ 16个字节(1个块)*16个块*8个扇区= 4096个字节.内存结构如下:
块上的数字表示其索引.每个扇区都受到扇区最后一个块中写入的站点密钥的保护.例如,块3包含扇区1的站点密钥和扇区2的块7.每个扇区中的最后一个块还包含访问条件信息,例如"写入","读取"和"读取和写入".下图演示了最后一个块如何包含:
而且,写在卡中的数据是二进制的; 0和1.
现在,您需要遵循的步骤来读取数据:
步骤1:检查设备是否支持NFC.
step2:检查设备是否有NXP芯片(特别是用于读取Mifare经典卡).
步骤3:实例化NFC管理器和NFC adpater并定义您想要读取的卡片技术列表.
step4:请求访问设备NFC的权限.
步骤5:创建检测卡的意图并指定要读取的MIME类型(在大多数情况下,它是所有MIME类型).
步骤6:在onResume()和onPause()中启用和禁用适配器的前台调度,以便当您的活动处于前台时,您的应用优先读取卡.
步骤7:当卡与设备联系时,您可以从中获取标签信息 intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
step8:读取卡片信息即; 卡类型,技术列表等..
步骤9:通过上面检索到的标签信息读取卡中需要连接卡的数据.
步骤10:遍历所有扇区.使用默认密钥// https://developer.android.com/reference/android/nfc/tech/MifareClassic.html#authenticateSectorWithKeyA(int,%20byte [])对每个扇区进行身份验证
步骤11:成功验证后,读取每个扇区块中的二进制数据.
step12:将二进制数据转换为字符串数据,以便我们可以读取它.
step13:就是这样,做任何你想做的数据.
惊喜!在我的github存储库中获取完整的工作代码:https: //github.com/codes29/RFIDReader
注意:我强调了你作为一个新手的感觉,并且在没有适当教程的情况下完成了这项任务.所以我在经过几天的努力之后更新了我写的代码.
以下是成功验证和读取数据后您将获得的示例.我扫描的卡片现在是空的.但如果这里有数据那么它肯定会在这里而不是0.
干杯! 快乐的编码兄弟!
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |