将字节数组转换为十六进制字符串

时间:2018-09-07 15:02:12

标签: arrays string kotlin hex byte

令人惊讶的是(对我而言),此代码无法满足我的要求:

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

结果证明Byte带符号的,因此对于单个字节,您将获得负十六进制表示,这将导致完全伪造的最终结果。

此外,Byte.toString不会填充您想在此处输入的前导零。

最简单的是什么(没有其他库,理想情况下没有扩展)。最有效的解决方案?

3 个答案:

答案 0 :(得分:11)

当我使用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') }

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

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

答案 1 :(得分:2)

printf在这里做了我们想要的:

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

答案 2 :(得分:0)

fun ByteArray.toHexString() = joinToString("") {
    Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}

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