2016-07-29 18 views
4

Stellen Sie sich vor, ich habe ein Kotlin-Programm mit einer Variablen b vom Typ Byte, in die ein externes System Werte größer als 127 schreibt. "Extern" bedeutet, dass ich den Typ des zurückgegebenen Wertes nicht ändern kann.Wie können Byte-Werte in Kotlin korrekt über 127 gehandhabt werden?

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

Sowohl a.toByte() und b.toInt() return -128.

Stellen Sie sich vor, ich möchte den richtigen Wert (128) von der Variablen b erhalten. Wie kann ich es tun?

Mit anderen Worten: Welche Implementierung von magicallyExtractRightValue würde den folgenden Test ausführen?

@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: Diese von Thilo vorgeschlagene Lösung scheint zu funktionieren.

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

'byte' unterzeichnet in Java, also wirst du haben damit leben. Warum musst du ein 'Byte' verwenden? Woher kommt der 'Int'? – Thilo

+0

Ich habe eine externe Bibliothek, die ich nicht ändern möchte. Es gibt mir byte-typed Werte mit negativen Zahlen in ihnen. –

+0

Also die Bibliothek gibt Ihnen bereits "-127". Warum musst du es konvertieren? Es macht keinen Unterschied, wenn Sie es numerisch verwenden. Wenn Sie sicher sind, dass die Bibliothek wirklich "128" bedeutet, könnten Sie 'short' oder' int' an Ihrem Ende der Dinge verwenden (konvertieren Sie dabei 255 + b für negative Zahlen). – Thilo

Antwort

8

ich eine extension function empfehlen die Schaffung dieses and mit zu tun:

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

Beispiel Nutzung:

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") 

Beispiel Ausgabe:

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] 
+0

die Eclipse Kotlin Plugin weiß irgendwie nicht die bitweise 'und', wie sonst kann das getan werden? – Xerus

+0

@Xerus Ich habe das Eclipse-Plugin nicht wirklich benutzt, daher bin ich mir nicht sicher, was ich sagen soll, aber ich vermute, etwas ist falsch konfiguriert, da 'und' Teil von" kotlin-stdlib "ist. Sie können versuchen, es als nicht infix zu verwenden: 'toInt(). Und (0xFF)'. – mfulton26

+1

Warum wird das nicht in Kotlin gebacken ??!? – ElliotM