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

问题描述 投票:4回答:3

令人惊讶的是(对我来说),这段代码没有做我想要的:

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

原来Byte已签名,因此您获得单个字节的负十六进制表示,这导致完全虚假的最终结果。

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

什么是最简单的(没有额外的库,理想情况下没有扩展名)。最有效的修复?

arrays string kotlin hex byte
3个回答
13
投票

正如我在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) }

2
投票

printf在这里做我们想要的:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.