arraysstringkotlinhexbyte

Converting a byte array into a hex string


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?


Solution

  • 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) }