Converting a byte array into a hex string

两盒软妹~` 提交于 2020-06-27 06:49:08

问题


Surprisingly (to me), this code does not do what I want:

fun ByteArray.toHexString() : String {
    return this.joinToString("") { it.toString(16) }
}

Turns out Byte is signed, so you get negative hex representations for individual bytes, which leads to a completely bogus end result.

Also, Byte.toString won't pad leading zeroes, which you'd want here.

What is the simplest (no additional libraries, ideally no extensions) resp. most efficient fix?


回答1:


As I am on Kotlin 1.3 you may also be interested in the UByte soon (note that it's an experimental feature. See also Kotlin 1.3M1 and 1.3M2 announcement)

E.g.:

@ExperimentalUnsignedTypes // just to make it clear that the experimental unsigned types are used
fun ByteArray.toHexString() = asUByteArray().joinToString("") { it.toString(16).padStart(2, '0') }

The formatting option is probably the nicest other variant (but maybe not that easily readable... and I always forget how it works, so it is definitely not so easy to remember (for me :-)):

fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }



回答2:


printf does what we want here:

fun ByteArray.toHexString() : String {
    return this.joinToString("") {
        java.lang.String.format("%02x", it)
    }
}



回答3:


fun ByteArray.toHexString() = joinToString("") {
    Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}

Fortunately, Java has toUnsignedString methods on Integer and Long. UNfortunately, these methods are only on Integer and Long, so you need to convert each byte first (using Byte#toUnsignedInt).




回答4:


This question has been answered, but I did not like the formatting. Here is something that formats it into something more readable ... at least for me.

@JvmOverloads
fun ByteArray.toHexString(separator: CharSequence = " ",  prefix: CharSequence = "[",  postfix: CharSequence = "]") =
    this.joinToString(separator, prefix, postfix) {
        String.format("0x%02X", it)
    }

output:

[0x10 0x22]


来源:https://stackoverflow.com/questions/52225212/converting-a-byte-array-into-a-hex-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!