驚くべきことに(私にとって)、このコードは私が望むことをしません:
fun ByteArray.toHexString() : String {
return this.joinToString("") { it.toString(16) }
}
Byte
はsignedであるため、個々のバイトに対して負の16進数表現が得られ、最終的に完全に偽の結果になります。
また、Byte.toString
は、ここで必要な先行ゼロをパディングしません。
最も単純なもの(追加ライブラリなし、理想的には拡張なし)は何ですか。最も効率的な修正?
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) }
printf
は、ここで必要なことを行います。
fun ByteArray.toHexString() : String {
return this.joinToString("") {
Java.lang.String.format("%02x", it)
}
}
fun ByteArray.toHexString() = joinToString("") {
Integer.toUnsignedString(Java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
}
幸いなことに、JavaにはtoUnsignedString
およびInteger
にLong
メソッドがあります。残念ながら、これらのメソッドはonly Integer
とLong
では、各バイトを最初に変換する必要があります( Byte#toUnsignedInt
)。