将字节数组转换为十六进制字符串
Posted
技术标签:
【中文标题】将字节数组转换为十六进制字符串【英文标题】:Converting a byte array into a hex string 【发布时间】:2019-02-12 23:09:49 【问题描述】:令人惊讶的是(对我而言),这段代码并没有达到我想要的效果:
fun ByteArray.toHexString() : String
return this.joinToString("") it.toString(16)
原来Byte
是有符号的,因此您会得到单个字节的负十六进制表示,这会导致完全虚假的最终结果。
另外,Byte.toString
不会填充前导零,这是您想要的。
什么是最简单的(没有额外的库,最好没有扩展)resp。最有效的解决方法?
【问题讨论】:
...你能给我一个输入吗? @Roland0xFF.toByte().toString(16)
@Roland 我的提示是在 SHA-256 哈希中看到 -
。
尝试了从0x00
到0xFF
的所有单字节字符串。此页面上的所有变体都会产生相同的结果。我在这里缺少什么?
只是想知道:您如何获得ByteArray
?
【参考方案1】:
fun ByteArray.toHexString() = joinToString("")
Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
幸运的是,Java 在Integer
和Long
上有toUnsignedString
方法。不幸的是,这些方法仅在Integer
和Long
上使用,因此您需要先转换每个字节(使用Byte#toUnsignedInt
)。
【讨论】:
否决票的任何理由?虽然现在有更好的方法可以内置到 Kotlin 中,但这仍然是正确和高效的(对于 Kotlin/JVM)。【参考方案2】:printf
在这里做我们想做的事:
fun ByteArray.toHexString() : String
return this.joinToString("")
java.lang.String.format("%02x", it)
【讨论】:
我怀疑你需要拼出java.lang.String
@msrd0 问题上没有 Java 标记。使用 KotlinJS,当我第一眼就可以排除这样的答案时,我会很感激。
@msrd0 我想我想确保不要选择 Kotlin 的 String
,但它确实似乎没有必要。
@Zackline 有趣的一点。是否已经出现了标记 Kotlin 有关 JVM/JS/android/Native 问题的约定?【参考方案3】:
由于我在 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)
【讨论】:
如果有人需要不针对 JVM 的版本:fun ByteArray.toHexString() = joinToString("") (0xFF and it.toInt()).toString(16).padStart(2, '0')
【参考方案4】:
已经回答了这个问题,但我不喜欢这种格式。这是将其格式化为更具可读性的内容……至少对我而言。
@JvmOverloads
fun ByteArray.toHexString(separator: CharSequence = " ", prefix: CharSequence = "[", postfix: CharSequence = "]") =
this.joinToString(separator, prefix, postfix)
String.format("0x%02X", it)
输出:
[0x10 0x22]
【讨论】:
以上是关于将字节数组转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章