问题描述
我正在开发一个 Android NFC 应用程序。此应用程序可以扫描 NFC 标签(这里我有一个 NXP NTAG 5 boost 标签,它是 NFC Forum Type 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
- 我只是假设您可以从 {{1}版本在这里,例如通过在 String
joinToString(separator="")
如果你想直接在数组上工作,你可以在它上面调用CharArray
:
asIterable()
但是您仍然需要在某个时候将每对字符组合成一个字符串,这就是转换 lambda 正在做的事情。 input.asIterable()
.chunked(2) { it.joinToString(separator="") }
.reversed()
.joinToString(":")
.run(::println)
接受一个转换函数,所以如果你愿意,你可以在那里进行