【问题标题】:Converting a byte array into a hex string将字节数组转换为十六进制字符串
【发布时间】:2019-02-12 23:09:49
【问题描述】:

令人惊讶的是(对我而言),这段代码并没有达到我想要的效果:

fun ByteArray.toHexString() : String {
    return this.joinToString("") { it.toString(16) }
}

原来Byte有符号的,因此您会得到单个字节的负十六进制表示,这会导致完全虚假的最终结果。

另外,Byte.toString 不会填充前导零,这是您想要的。

什么是最简单的(没有额外的库,最好没有扩展)resp。最有效的解决方法?

【问题讨论】:

  • ...你能给我一个输入吗?
  • @Roland 0xFF.toByte().toString(16)
  • @Roland 我的提示是在 SHA-256 哈希中看到 -
  • 尝试了从0x000xFF 的所有单字节字符串。此页面上的所有变体都会产生相同的结果。我在这里缺少什么?
  • 只是想知道:您如何获得ByteArray

标签: arrays string kotlin hex byte


【解决方案1】:
fun ByteArray.toHexString() = joinToString("") {
    Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}

幸运的是,Java 在IntegerLong 上有toUnsignedString 方法。不幸的是,这些方法IntegerLong 上使用,因此您需要先转换每个字节(使用Byte#toUnsignedInt)。

【讨论】:

  • 否决票的任何理由?虽然现在有更好的方法可以内置到 Kotlin 中,但这仍然是正确和高效的(对于 Kotlin/JVM)。
【解决方案2】:

printf 在这里做我们想做的事:

fun ByteArray.toHexString() : String {
    return this.joinToString("") {
        java.lang.String.format("%02x", it)
    }
}

【讨论】:

  • 我怀疑你需要拼出java.lang.String
  • @msrd0 问题上没有 Java 标记。使用 KotlinJS,当我第一眼就可以排除这样的答案时,我会很感激。
  • @msrd0 我想我想确保不要选择 Kotlin 的 String,但它确实似乎没有必要。
  • @Zackline 有趣的一点。是否已经出现了标记 Kotlin 有关 JVM/JS/Android/Native 问题的约定?
【解决方案3】:

由于我在 Kotlin 1.3 上,您可能很快也会对 UByte 感兴趣(请注意,这是一个实验性功能。另请参阅 Kotlin 1.3M11.3M2 announcement

例如:

@ExperimentalUnsignedTypes // just to make it clear that the experimental unsigned types are used
fun ByteArray.toHexString() = asUByteArray().joinToString("") { it.toString(16).padStart(2, '0') }

格式化选项可能是最好的其他变体(但可能不是那么容易阅读......而且我总是忘记它是如何工作的,所以它绝对不是那么容易记住(对我来说:-)):

fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }

【讨论】:

  • 如果有人需要不针对 JVM 的版本:fun ByteArray.toHexString() = joinToString("") { (0xFF and it.toInt()).toString(16).padStart(2, '0') }
【解决方案4】:

已经回答了这个问题,但我不喜欢这种格式。这是将其格式化为更具可读性的内容……至少对我而言。

@JvmOverloads
fun ByteArray.toHexString(separator: CharSequence = " ",  prefix: CharSequence = "[",  postfix: CharSequence = "]") =
    this.joinToString(separator, prefix, postfix) {
        String.format("0x%02X", it)
    }

输出:

[0x10 0x22]

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 2017-06-17
    • 2018-05-09
    • 2023-03-07
    相关资源
    最近更新 更多