Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将字节数组转换为十六进制字符串_Arrays_String_Kotlin_Hex_Byte - Fatal编程技术网

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]