2015-10-29 11 views
12

Sto cercando di scrivere codice Kotlin come:bit a bit e non funziona con i byte in Kotlin

for (byte b : hash) 
    stringBuilder.append(String.format("%02x", b&0xff)); 

ma non ho nulla a che fare con la "&". Sto cercando di usare "b e 0xff" ma non funziona. Il bit "e" sembra funzionare su Int, non su byte.

java.lang.String.format("%02x", (b and 0xff)) 

è ok per utilizzare

1 and 0xff 
+0

Potrebbe spiegare ciò che il codice fa? Non ho mai visto una simile sintassi prima dello – voddan

risposta

13

Kolin fornisce bit a bit operatore come infix functions disponibile per Int e Long solo.

Quindi è necessario convertire i byte per interi per eseguire ops bit a bit:

val b : Byte = 127 
val res = (b.toInt() and 0x0f).toByte() // evaluates to 15 

UPDATE: Dal Kotlin 1.1 queste operazioni sono disponibili direttamente sul Byte.

Da bitwiseOperations.kt:

@SinceKotlin("1.1") 
public inline infix fun Byte.and(other: Byte): Byte = (this.toInt() and other.toInt()).toByte() 
+0

È anche utile notare che java fa anche questa conversione allargata. È solo implicito. – Raman

5

bit a bit "e" di qualsiasi byte-value e 0xFF restituirà sempre il valore originale.

E 'semplice da vedere questo se si disegna i bit in un diagramma:

00101010 42 
11111111 and 0xff 
-------- 
00101010 gives 42 
+0

ma perché così tante persone lo usano per convertire un byte in int? –

+1

No, è usato per troncare un 'int' in modo che si adatti a un byte. – ams

+0

I byte @AllenVork in java sono * firmati * e java li converte implicitamente in un 'int' quando esegue operazioni bit a bit (Kotlin richiede semplicemente che questo sia esplicito). Pertanto, affinché questa conversione di ampliamento produca il valore int previsto positivo quando il valore del byte iniziale è negativo, si mascherano i 3 byte di ordine superiore del valore int esteso (che include il bit di segno) tramite '& 0xff' . – Raman