2016-04-26 10 views
4

Ich versuche, 2 Bytes in einen kurzen zu verschieben. Diese 2 Bytes stellen einen vorzeichenlosen Kurzschluss dar, der wiederum einen Port darstellt. Ich habe mehrere Möglichkeiten ausprobiert, um diese Bytes in Java zu konvertieren. Allerdings schaffe ich es immer wieder falsch.Java Shifting Bytes gibt ein unerwartetes Ergebnis

Dies sind die Möglichkeiten, wie ich versucht habe:

byte a = 0x17; 
byte b = 0xCC; 

(short)((a << 8) | b); 
(short)(((short)a << 8) | b); 

Das Ergebnis 0xFFCC ist, sollte aber 0x17CC sein.

Antwort

5

Jeder Wert, der in Java arithmetisch behandelt wird, wird zuerst in einen höheren Typ umgewandelt, der beide Operanden abdeckt. Beide Operanden werden in int umgewandelt, wenn sie noch kleiner sind.

Als Ergebnis wird b zuerst zu int umgewandelt und wird 0xFFFFFFCC. Bei einer Verschiebung um 8 Bit nach links bleibt die Maske immer 0xFFFFFF00 und hat daher keinen Einfluss auf das Ergebnis. Wenn man es kurz ausgibt, werden nur die linken 16 Bits verkleinert.

es zu beheben, explizit mit 0xFF vor der Operation Maske tun:

diese
(short)(((a&0xFF)<<8)|(b&0xFF)) 
+0

Danke du, endlich funktioniert! :) Nach dem Lesen macht es viel Sinn. – Max

0

// Versuchen Sie, da Sie nicht von int nach Byte umwandeln kann:

short a = 0x17; short b = 0xCC; System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));

// Ausgabe: r = 0x17CC

Verwandte Themen