为什么使用Android手机读取NFCtag时会获得与使用专用阅读器读取时不同的标签ID?

问题描述 投票:0回答:2

我正在使用Android Cilico F750,专用的RFID阅读器是CF-RS103。RFID标签类型为MIFARE Ultralight类型C。

[使用专用读卡器读取时,标签的ID为:2054270212(10位数)。

但是当使用Android手机阅读时,ID为:36113912876727556(17位数字),而ID的反向ID为:1316602805183616(16位数字)。

没有人知道为什么会发生这种情况,并且是否有可能将10位ID转换为17位ID,反之亦然。

android nfc rfid
2个回答
0
投票

我不知道您为什么总是尝试转换为十进制?并且请尝试说明有关您用于读取UID的代码的更多信息。

关于您的电话号码,并将17位数字转换为10位数字;我将它们都转换为十六进制:

36139312876727556(17digit)以十六进制表示:8064837A71AD04。

2054270212(10位数),十六进制:7A71AD04

您注意到,您可以仅修剪前三个字节以获取10位数字。

而且,我确实相信他们都不是UID。但是7个字节(如Andrew所说),您已经在照片中读取了它:(04:B5:71:7A:83:64:80)


0
投票

所以我认为答案是,因为您将7字节ID转换为十进制,所以由于转换为十进制,所以得到的数字长度是可变的。

“字节数据类型是一个8位带符号的二进制补码整数。其最小值为-128,最大值为127(包括127)。”

来自https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

可以生成一个具有1,2或3个字符的十进制数字,因此id的长度可以不同。

似乎从理论上讲转换也有问题,它在其中也应该有负数。

如果您希望它可以被人类阅读,最好将它作为十六进制字符串来处理。

Java中将ID的2页转换为十六进制的正确方法是

StringBuilder Uid;
for (int i = 0; i < result.length; i++) {
                        // byte 4 is a check byte
                        if (i == 3) continue;
                        Uid.append(String.format("%02X ", result[i]));
                    }

或者,如果不是低水平阅读,则>

https://developer.android.com/reference/android/nfc/Tag#getId()

将获得您的ID。

根据卡的规格表https://www.nxp.com/docs/en/data-sheet/MF0ICU2_SDS.pdf(第7.3.1节)的说明

有校验字节是ID的一部分,尽管同一张卡上的校验字节总是相同的,并且仍然会为您提供唯一的ID,但从技术上讲,它不是ID的一部分。

请注意,“ 36139312876727556(17digit)和反向ID”在转换为十六进制并反向实际时为7个字节,并以正确的数字开头。

10位数字看起来像7字节数字的前4个字节也被颠倒了。

© www.soinside.com 2019 - 2024. All rights reserved.