Wie richtig zu verarbeiten Byte-Werte, die größer als 127 in Kotlin?
Vorstellen, ich habe eine Kotlin-Programm mit einer Variablen b
Typ Byte
, in die das externe system schreibt die Werte, die größer als 127
. "External" bedeutet, dass ich nicht ändern kann die Art der Wert, den es gibt.
val a:Int = 128
val b:Byte = a.toByte()
Beide a.toByte()
und b.toInt()
zurück -128
.
Vorstellen, ich will den richtigen Wert (128
) aus der variable b
. Wie kann ich es tun?
In anderen Worten: Was die Umsetzung der magicallyExtractRightValue
würde, machen Sie 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 Lösung vorgeschlagen, die von Thilo scheint zu funktionieren.
private fun magicallyExtractRightValue(o: Byte): Int = when {
(o.toInt() < 0) -> 255 + o.toInt() + 1
else -> o.toInt()
}
byte
ist unterzeichnet in Java, so haben Sie, um live mit dabei. Warum haben Sie verwenden, um einebyte
? Wo ist derint
aus?- Ich habe eine externe library, die ich nicht ändern wollen. Es gibt mir die byte-Werte eingegeben, mit negativen zahlen.
- so ist die Bibliothek schon gibt Sie "-127". Warum müssen Sie es zu konvertieren? Es nicht einen Unterschied machen, wenn Sie es verwenden, numerisch. Wenn Sie sicher sind, dass die Bibliothek wirklich "gemeint" 128 stattdessen könnte man verwenden
short
oderint
Ihr am Ende der Dinge (konvertieren-by-doing-255 + b für negative zahlen). - Ich brauche den tatsächlichen numerischen Wert, weil in einem anderen third-party-Bibliothek, der numerische Wert wird als index in einem array.
- Array-Indizes sind
int
. Sie können konvertieren von Ihrem "unsigned byte" by doingint x = b < 0 ? 255 + b : b;
- stackoverflow.com/questions/4266756/...
- Danke. Wenn Sie uns Ihren Kommentar als eine Antwort, ich werde es akzeptieren. Siehe auch mein update 1.
- Ich konnte ihn nicht finden, bevor, aber hier ist eine Frage im Zusammenhang: stackoverflow.com/q/2640946/3255152.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Kotlin 1.3+ können Sie unsigned-Typen. z.B.
toUByte
(Kotlin Spielplatz):oder sogar verlangen, mit
UByte
direkt stattByte
(Kotlin Spielplatz):Für releases vor Kotlin 1.3, empfehle ich das erstellen einer Erweiterung-Funktion, dies zu tun mit
und
:Beispiel:
Beispiel-Ausgabe:
and
wie sonst kann dies gemacht werden?and
ist Teil der "kotlin-stdlib". Sie könnten versuchen, es als nicht-infix:toInt().and(0xFF)
.BluetoothGattCharacteristic
. Danke.and
ist gebraucht.toUByte
usw. in Kotlin 1.3+ für Ihren Einsatz bei 1.3.20.Guten alten
printf
tut, was wir wollen: