web-dev-qa-db-ja.com

バイト配列を16進文字列に変換する

驚くべきことに(私にとって)、このコードは私が望むことをしません:

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

Bytesignedであるため、個々のバイトに対して負の16進数表現が得られ、最終的に完全に偽の結果になります。

また、Byte.toStringは、ここで必要な先行ゼロをパディングしません。

最も単純なもの(追加ライブラリなし、理想的には拡張なし)は何ですか。最も効率的な修正?

5
Raphael

Kotlin 1.3を使用しているので、すぐにUByteにも興味があるかもしれません(これは実験的な機能です。 Kotlin 1.3M1 および 1.3M2発表 も参照してください。 =)

例えば。:

@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) }
20
Roland

printfは、ここで必要なことを行います。

fun ByteArray.toHexString() : String {
    return this.joinToString("") {
        Java.lang.String.format("%02x", it)
    }
}
3
Raphael
fun ByteArray.toHexString() = joinToString("") {
    Integer.toUnsignedString(Java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}

幸いなことに、JavaにはtoUnsignedStringおよびIntegerLongメソッドがあります。残念ながら、これらのメソッドはonly IntegerLongでは、各バイトを最初に変換する必要があります( Byte#toUnsignedInt )。

0
Moira