【问题标题】:How to add two dots for each nth character?如何为每个第 n 个字符添加两个点?
【发布时间】:2021-05-03 16:32:40
【问题描述】:

我正在开发一个 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

【问题讨论】:

    标签: android kotlin formatting uid


    【解决方案1】:

    我不知道你对效率有多疯狂,但这是一种方法!

    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 需要一个转换函数,所以如果你愿意,你可以在那里做

    【讨论】:

    • 对不起,我刚刚意识到你在这里处理字节,等等
    • 感谢您的帮助!我接受你的回答,但如果你或其他人提出直接使用CharArray 的解决方案,我也在倾听。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多