首页 文章

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

提问于
浏览
1

我正在尝试创建一个Android应用程序,使用NFC阅读器读取一些RFID卡 .

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

在我的应用程序中,我使用intent额外 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?

1 回答

  • 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);
    }
    

相关问题