【问题标题】:Card ID is different when I use NFC reader on Android and RFID reader on PC当我在 Android 上使用 NFC 读卡器和在 PC 上使用 RFID 读卡器时,卡 ID 不同
【发布时间】:2018-10-18 01:03:42
【问题描述】:

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

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

在我的应用程序中,我使用额外的意图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 相同的 ID?

【问题讨论】:

  • 你得到的两个值是什么?
  • 我从 FRID 设备得到 3853004524
  • 当我从我的应用程序中使用此代码时得到 23646168229

标签: android nfc number-formatting rfid serial-number


【解决方案1】:

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

让我们首先看一下您从 PC 上的 RFID 阅读器获得的值 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);
}

【讨论】:

  • 非常感谢您回答我的问题并尝试为我编写正确的函数。该功能正常工作,输出正确:)
【解决方案2】:

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

在 .Net 中是一个内置类来做同样的事情:

BitConverter.ToUInt32(barray, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多