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

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。最有效的解决方法?

【问题讨论】:

...你能给我一个输入吗? @Roland 0xFF.toByte().toString(16) @Roland 我的提示是在 SHA-256 哈希中看到 - 尝试了从0x000xFF 的所有单字节字符串。此页面上的所有变体都会产生相同的结果。我在这里缺少什么? 只是想知道:您如何获得ByteArray 【参考方案1】:
fun ByteArray.toHexString() = joinToString("") 
    Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')

幸运的是,Java 在IntegerLong 上有toUnsignedString 方法。不幸的是,这些方法IntegerLong 上使用,因此您需要先转换每个字节(使用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]

【讨论】:

以上是关于将字节数组转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将十六进制字符串转换为字节数组,以及十六进制字符串中的字节数组?

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

如何将字符串转换为十六进制字节数组? [复制]

将奇数长度的java字符串转换为十六进制字节数组

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

如何将普通字符串转换为等效的十六进制字节数组? [复制]