令人惊讶的是(对我而言),此代码无法满足我的要求:
fun ByteArray.toHexString() : String {
return this.joinToString("") { it.toString(16) }
}
结果证明Byte
是带符号的,因此对于单个字节,您将获得负十六进制表示,这将导致完全伪造的最终结果。
此外,Byte.toString
不会填充您想在此处输入的前导零。
最简单的是什么(没有其他库,理想情况下没有扩展)。最有效的解决方案?
答案 0 :(得分:11)
当我使用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') }
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在toUnsignedString
和Integer
上有Long
个方法。不幸的是,这些方法在Integer
和Long
上仅是 ,因此您需要首先转换每个字节(使用Byte#toUnsignedInt
)。