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

问题描述

我正在开发一个 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) 接受一个转换函数,所以如果你愿意,你可以在那里进行

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...