我是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;
}
非常感谢!
答案 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转换为十六进制数字(正如您在帖子中的方法所示),您将获得:
因此,您无法获得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 "";
}
}