当我在Android上使用NFC阅读器和在PC上使用RFID阅读器时,卡ID不同

时间:2018-05-08 06:47:45

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

我正在尝试使用NFC阅读器创建一个Android应用程序来读取某些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?

2 个答案:

答案 0 :(得分:0)

两个值(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);
}

答案 1 :(得分:0)

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

.Net中的内置类可以执行以下操作:

BitConverter.ToUInt32(barray, 0);