当我在 Android 上使用 NFC reader 并在 PC 上使用 RFID reader 时,卡 ID 不同

Card ID is different when I use NFC reader on Android and RFID reader on PC

我正在尝试创建一个 Android 应用程序来使用 NFC reader 读取一些 RFID 卡。

当我读取 PC 上的 RFID 芯片时,reader returns 卡的 ID 3853004524。当我尝试使用我的应用读取同一张卡片时,我得到了不同的 ID (23646168229)。

在我的应用程序中,我使用 intent extra NfcAdapter.EXTRA_ID 来获取卡的 ID。我使用以下方法将该字节数组转换为字符串:

private String byteArrayToDecimal(byte[] barray) {
    String result="";
    for (byte b : barray) {
        result = result + (b & 0xff);
    }
    return result;
}

protected void onNewIntent(Intent intent) {
    if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
        Toast.makeText(G.context,"NFC Tag\n" +
                byteArrayToDecimal(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)),Toast.LENGTH_LONG).show();//ByteArrayToDecString
    }
}

为什么同一张卡有两个不同的 ID?我怎样才能通过该应用程序获得与我在 PC 上获得的相同的 ID?

这两个值(3853004524 和 23646168229)本质上是相同的 ID 值。您从应用程序中获得如此奇怪的值的原因是您使用了一种相当奇怪的转换方法将字节数组转换为字符串。

让我们先看一下您从 PC 上的 RFID reader 获得的值 3853004524。这似乎是卡 ID 的十进制表示。为了更好地将其与您在 Android 上获得的内容相匹配,让我们将其转换为其十六进制表示形式:0xE5A82EEC。这可能是一个有效的 4 字节 UID(因为它被使用,例如,在 NFC-A 中)。

接下来让我们看看你的相当奇怪的转换函数:

private String byteArrayToDecimal(byte[] barray) {
    String result="";
    for (byte b : barray) {
        result = result + (b & 0xff);
    }
    return result;
}

此方法从输入字节数组中获取每个字节,将其转换为无符号十进制整数,并将十进制表示形式附加到字符串中。如果我们尝试使用您在 PC 上获得的卡 ID,这将导致:

  • 0xE5 得到“229”
  • 0xA8 得到“168”
  • 0x2E 得到“46”
  • 0xEC 得到“236”

当您查看在应用中获得的值时,您会发现所有这些十进制数字都串联在您的结果中。此外,您会看到所有数字都以相反的顺序连接在一起。这意味着您从 intent.getByteArrayExtra(NfcAdapter.EXTRA_ID) 获得的字节数组是

{ (byte)0xEC, (byte)0x2E, (byte)0xA8, (byte)0xE5 }

为了将其转换为您的 PC 应用程序打印出的值,您可以使用如下内容:

private String byteArrayToDecimal(byte[] barray) {
    if (barray == null) return "";
    long result = 0;
    for (int i = barray.length - 1; i >= 0; --i) {
        result <<= 8;
        result |= barray[i] & 0x0FF;
    }
    return Long.toString(result);
}

也许为时已晚。以防万一有人正在寻找这个解决方案。

在 .Net 中是内置的 class 做同样的事情:

BitConverter.ToUInt32(barray, 0);