Arrays 将字节数组转换为十六进制字符串
令人惊讶的是(对我来说),这段代码并没有达到我想要的效果:Arrays 将字节数组转换为十六进制字符串,arrays,string,kotlin,hex,byte,Arrays,String,Kotlin,Hex,Byte,令人惊讶的是(对我来说),这段代码并没有达到我想要的效果: fun ByteArray.toHexString() : String { return this.joinToString("") { it.toString(16) } } 原来Byte是有符号的,所以每个字节都有负十六进制表示,这会导致完全虚假的最终结果 另外,Byte.toString不会填充前导零,这是您在这里想要的 最简单的(没有附加库,理想情况下没有扩展)resp是什么。最有效的修复 fun ByteArray
fun ByteArray.toHexString() : String {
return this.joinToString("") { it.toString(16) }
}
原来Byte
是有符号的,所以每个字节都有负十六进制表示,这会导致完全虚假的最终结果
另外,Byte.toString
不会填充前导零,这是您在这里想要的
最简单的(没有附加库,理想情况下没有扩展)resp是什么。最有效的修复
fun ByteArray.toHexString() = joinToString("") {
Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}
幸运的是,Java在
Integer
和Long
上有toUnsignedString
方法。不幸的是,这些方法仅适用于Integer
和Long
,因此您需要先转换每个字节(使用)。printf
实现了我们想要的功能:
fun ByteArray.toHexString() : String {
return this.joinToString("") {
java.lang.String.format("%02x", it)
}
}
由于我使用的是Kotlin 1.3,您可能很快也会对
UByte
感兴趣(请注意,这是一项实验性功能。另请参见和)
例如:
格式化选项可能是最好的其他变体(但可能不是那么容易阅读…而且我总是忘记它是如何工作的,所以它肯定不那么容易记住(对我来说:-):
这个问题已经回答了,但我不喜欢格式。这里有一些东西可以把它格式化成更可读的东西。。。至少对我来说
@JvmOverloads
fun ByteArray.toHexString(separator: CharSequence = " ", prefix: CharSequence = "[", postfix: CharSequence = "]") =
this.joinToString(separator, prefix, postfix) {
String.format("0x%02X", it)
}
输出:
[0x10 0x22]
... 你能给我一个可以得到虚假输出的输入吗?@Roland
0xFF.toByte().toString(16)
@Roland我的提示是在SHA-256哈希中看到-
。尝试了从0x00
到0xFF
的所有单字节字符串。此页面上的所有变体都会产生相同的结果。。我在这里遗漏了什么?只是想知道:你是如何得到你的ByteArray
?我怀疑你是否需要拼出java.lang.String
@msrd0这个问题上没有java标记。使用KotlinJS,当我第一眼就能排除这样的答案时,我会很感激。@msrd0我想我是想确保不要选择Kotlin的字符串
,但它确实似乎没有必要。@Zackline有趣的一点。关于JVM/JS/Android/Native的Kotlin问题的标签有什么约定吗?如果有人需要一个不以JVM为目标的版本:fun ByteArray.toHexString()=joinToString(“”{(0xFF和it.toInt()).toString(16).padStart(2,'0')}
投票失败的原因是什么?虽然现在有更好的方法内置到Kotlin中,但这仍然是正确和有效的(对于Kotlin/JVM)。
@JvmOverloads
fun ByteArray.toHexString(separator: CharSequence = " ", prefix: CharSequence = "[", postfix: CharSequence = "]") =
this.joinToString(separator, prefix, postfix) {
String.format("0x%02X", it)
}
[0x10 0x22]