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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Nexus 5获取Mifare Ultralight 16位UID读数相关的知识,希望对你有一定的参考价值。

我是android的NFC新手。我需要非常多的代码示例或Java的好教程,以获得如何使用Nexus 5获取Mifare Ultralight 16位UID读数

我只知道如何从这里Reading the tag UID of Mifare classic card获得MifareClassic的7位UID,但没有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;
}

非常感谢你!

答案

首先,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 "";
    }
}

以上是关于如何使用Nexus 5获取Mifare Ultralight 16位UID读数的主要内容,如果未能解决你的问题,请参考以下文章

获取 mifare 卡序列号不正确

如何更改 Mifare Classic 1k 密钥 A 和密钥 B

使用 SCL010 获取 Mifare Ultralight 的 UID

Mifare DESFire 读取文件

如何读取 mifare 卡的二进制块?

Mifare卡版获取方法