web-dev-qa-db-ja.com

Kotlinで127より大きいバイト値を正しく処理するにはどうすればよいですか?

タイプbの変数Byteを含むKotlinプログラムがあり、外部システムが_127_より大きい値を書き込むと想像してください。 「外部」とは、返される値のタイプを変更できないことを意味します。

val a:Int = 128 val b:Byte = a.toByte()

a.toByte()b.toInt()はどちらも_-128_を返します。

変数bから正しい値(_128_)を取得したいとします。どうすればできますか?

つまり、magicallyExtractRightValueをどのように実装すると、次のテストが実行されますか?

_@Test
fun testByteConversion() {
    val a:Int = 128
    val b:Byte = a.toByte()

    System.out.println(a.toByte())
    System.out.println(b.toInt())

    val c:Int = magicallyExtractRightValue(b)

    Assertions.assertThat(c).isEqualTo(128)
}

private fun magicallyExtractRightValue(b: Byte): Int {
    throw UnsupportedOperationException("not implemented")
}
_

Update 1:Thilo によって提案されたこのソリューションは機能しているようです。

_private fun magicallyExtractRightValue(o: Byte): Int = when {
    (o.toInt() < 0) -> 255 + o.toInt() + 1
    else -> o.toInt()
}
_
24

Kotlin 1.3以降では、 nsigned types を使用できます。例えば toUByteKotlin Playground ):

private fun magicallyExtractRightValue(b: Byte): Int {
    return b.toUByte().toInt()
}

または、UByteの代わりにByteを直接使用する必要があります( Kotlin Playground ):

private fun magicallyExtractRightValue(b: UByte): Int {
    return b.toInt()
}

Kotlin 1.3より前のリリースでは、 and を使用して 拡張関数 を作成することをお勧めします。

fun Byte.toPositiveInt() = toInt() and 0xFF

使用例:

val a: List<Int> = listOf(0, 1, 63, 127, 128, 244, 255)
println("from ints: $a")
val b: List<Byte> = a.map(Int::toByte)
println("to bytes: $b")
val c: List<Int> = b.map(Byte::toPositiveInt)
println("to positive ints: $c")

出力例:

from ints: [0, 1, 63, 127, 128, 244, 255]
to bytes: [0, 1, 63, 127, -128, -12, -1]
to positive ints: [0, 1, 63, 127, 128, 244, 255]
37
mfulton26

古き良きprintfは私たちが望むことをします:

Java.lang.String.format("%02x", byte)
0
Raphael