我正在开发一个Android NFC应用程序。该应用程序可以扫描NFC标签(这里我有一个NXP NTAG 5增强标签,它是NFC论坛类型5标签(。
由于NFC-V标签的UID是反向的,我的目标是显示NFC标签的(重新(反向UID,其中每个字节由两个点分隔。
下面是我用来做这件事的方法。它反转UID并将其转换为十六进制,但我不知道如何插入":"每隔一个字符分隔一次。
fun byteArrayToHexInversed(bytes: ByteArray): String {
//First reverse the UID
bytes.reverse()
//Then convert byteArray to Hexa
val hexChars = CharArray(bytes.size * 2)
for (j in bytes.indices) {
val v = bytes[j].toInt() and 0xFF
hexChars[j * 2] = hexArray[v ushr 4]
hexChars[j * 2 + 1] = hexArray[v and 0x0F]
}
//Finally return the String with the separators
return hexChars.joinToString(":") { byte ->
byte.toString().padStart(2, '0')
}
}
以下是我输入的内容:
000839CB580104E0
以下是我想要的输出:
E0:04:01:58:CB:39:08:00
我不知道你有多热衷于提高效率,但这里有一种方法!
var input = "000839CB580104E0"
input.chunked(2).reversed().joinToString(":").run(::println)
>> E0:04:01:58:CB:39:08:00
它基本上是将你的输入分成一个由两个字符块组成的列表(这样它们就可以保持顺序,例如E0
(,然后反转该列表(这样块本身就不会反转,但它们是按相反的顺序列出的(,剩下的你就知道了!
如果你想要更高效的索引,你可以按照相反的顺序遍历数组,成对地抓取字符
我无法让你的hexChars.joinToString { byte conversion }
东西与该输入一起工作,所以我可能没有正确设置hexChars
-我只是假设你可以在这里从String
版本开始,例如在CharArray
上调用joinToString(separator="")
如果你想直接处理数组,你可以在上面调用asIterable()
:
input.asIterable()
.chunked(2) { it.joinToString(separator="") }
.reversed()
.joinToString(":")
.run(::println)
但是您仍然需要在某个时刻将每对字符组合成一个字符串,这就是lambda转换所要做的。joinToString
将一个转换函数带到,所以如果你喜欢,你可以在那里做它