令人惊讶的是(对我来说),这段代码没有做我想要的:
fun ByteArray.toHexString() : String {
return this.joinToString("") { it.toString(16) }
}
原来Byte
已签名,因此您获得单个字节的负十六进制表示,这导致完全虚假的最终结果。
此外,Byte.toString
不会填充前导零,这是你想要的。
什么是最简单的(没有额外的库,理想情况下没有扩展名)。最有效的修复?
正如我在Kotlin 1.3上你很快就会对UByte
感兴趣(注意它是一个实验性功能。另见Kotlin 1.3M1和1.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) }
printf
在这里做我们想要的:
fun ByteArray.toHexString() : String {
return this.joinToString("") {
java.lang.String.format("%02x", it)
}
}
fun ByteArray.toHexString() = joinToString("") {
Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}
幸运的是,Java在toUnsignedString
和Integer
上有Long
方法。遗憾的是,这些方法仅适用于Integer
和Long
,因此您需要先转换每个字节(使用Byte#toUnsignedInt
)。