如何为每个第 n 个字符添加两个点?

How to add two dots for each nth character?

我正在开发 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 - 我只是假设你可以从 String 版本在这里,例如通过在 CharArray

上调用 joinToString(separator="")

如果你想直接在数组上工作,你可以在上面调用asIterable():

input.asIterable()
    .chunked(2) { it.joinToString(separator="") }
    .reversed()
    .joinToString(":")
    .run(::println)

但是您仍然需要在某个时候将每对字符组合成一个字符串,这就是 transform lambda 所做的。 joinToString 需要一个转换函数,所以如果你愿意,你可以在那里做