【问题标题】:How get Mifare Ultralight 16 digits UID reading with Nexus 5如何使用 Nexus 5 读取 Mifare Ultralight 16 位 UID
【发布时间】:2014-06-06 19:56:20
【问题描述】:

我是 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;
}

非常感谢!

【问题讨论】:

    标签: android nfc rfid mifare serial-number


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多