如何使用Nexus 5获取Mifare Ultralight 16位UID读数

时间:2014-06-06 19:56:20

标签: android nfc rfid mifare serial-number

我是Android的NFC新手。我需要非常多的代码示例或Java的优秀教程,了解如何使用Nexus 5获取Mifare Ultralight 16位UID读取

我只知道如何从这里获得MifareClassic的7位UID Reading the tag UID of Mifare classic card,但没有Mifare Ultralight的例子。

这是另一个获得Mifare Classic UID的例子。我需要更改什么才能让它为Mifare Ultralight阅读?我不明白在ByteArrayToHexString()

中执行什么
byte[] nfcUID = null;
        if (intent != null && (nfcUID = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)) != null) {

            uid = ByteArrayToHexString(nfcUID);

private String ByteArrayToHexString(byte[] inarray) { // converts byte arrays to string
        int i, j, in;
        String[] hex = {
                "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
        };
    String out = "";

    for (j = 0; j < inarray.length; ++j) {
        in = inarray[j] & 0xff;
        i = (in >> 4) & 0x0f;
        out += hex[i];
        i = in & 0x0f;
        out += hex[i];
    }
    return out;
}

非常感谢!

1 个答案:

答案 0 :(得分:4)

首先,MIFARE Classic标签通常有一个4字节的UID(也称为nUID)。较新的MIFARE Classic标签也有7个字节的UID。 MIFARE Ultralight标签总是有一个7字节的UID。

这个UID就是你从

获得的
byte[] uid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

或来自

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] uid = tag.getId();

如果您将该UID转换为十六进制数字(正如您在帖子中的方法所示),您将获得:

  • 如果UID有4个字节,则为8位数字,或
  • 如果UID有7个字节,则为14位数字。

因此,您无法获得MIFARE Ultralight标签的16位十六进制数字。

由于MIFARE Ultrlaight UID(或实际上来自NXP的任何7字节UID)具有0x04xxxxxxxxxxxx形式,将其转换为十进制数将最多为您提供一个16位数字(0x04FFFFFFFFFFFF = 1407374883553279) 。所以你可能试图实现这一目标。但是,将4字节UID转换为十进制仍然不会产生7位数字。


转换为十六进制表示

您可以使用类似的东西将UID从字节数组转换为十六进制数字字符串:

public static String convertByteArrayToHexString (byte[] b) {
    if (b != null) {
        StringBuilder s = new StringBuilder(2 * b.length);
        for (int i = 0; i < b.length; ++i) {
            final String t = Integer.toHexString(b[i]);
            final int l = t.length();
            if (l > 2) {
                s.append(t.substring(l - 2));
            } else {
                if (l == 1) {
                    s.append("0");
                }
                s.append(t);
            }
        }
        return s.toString();
    } else {
        return "";
    }
}

此方法获取字节数组的每个字节,将其转换为2位十六进制数,并将所有这些2位数字连接成一个字符串。


转换为十进制表示

public static String convertByteArrayToDecString (byte[] b) {
    if (b != null) {
        BigInteger n = new BigInteger(1, b);
        return n.toString();
    } else {
        return "";
    }
}