Ich analysiere unsignierte Bits von einem DatagramSocket. Ich habe insgesamt 24 Bits (oder 3 Bytes) kommen - sie sind: 1 unsigned 8bit Integer gefolgt von einer 16bit signed Integer. Aber Java speichert nie mehr als ein vorzeichenbehaftetes Byte in einem Byte / Byte-Array? Wenn Java diese Werte akzeptiert, verlierst du das letzte 8. Bit?
%Vor%
Habe ich jetzt dieses 8. Bit verloren, seit ich es in ein Byte umgewandelt habe? War es falsch, dass ich ein Byte-Array von 3 Bytes initialisiert habe?
Wenn Java diese Werte akzeptiert, verlierst du das letzte 8. Bit?
Nein. Sie haben am Ende einen negativen Wert, wenn er eingestellt ist.
Um einen Wert zwischen 0 und 255 zu erhalten, ist es am einfachsten, so etwas zu verwenden:
%Vor% Zuerst wird das byte
zu einem int
hochgestuft, das Zeichen wird erweitert, was zu 25 führenden 1 Bits führt, wenn das hohe Bit 1 im ursprünglichen Wert ist. Die & 0xff
wird dann die ersten 24 Bits wieder los:)
Nein, du verlierst das 8. Bit nicht. Aber leider hat Java zwei "Features", die es schwieriger machen, mit solchen Werten umzugehen:
byte
in ein int
, wie es hier der Fall ist), wird das Vorzeichenbit des "unteren Typs" erweitert . Dies bedeutet zum Beispiel, dass Sie das Byte 0x80
lesen, das in binär als:
Wenn Sie es als Integer lesen, erhalten Sie:
%Vor%während Sie wirklich wollten:
%Vor%dh, ganzzahliger Wert 128. Sie MÜSSEN daher maskiert werden:
%Vor%Traurig, aber wahr.
Allgemeiner gesagt: Wenn Sie viele byte-orientierte Daten manipulieren möchten, sollten Sie sich ByteBuffer , kann es sehr helfen. Aber das wird Sie leider nicht vor Bitmaskenmanipulationen retten, es ist nur, dass es einfacher ist, eine bestimmte Anzahl von Bytes als Zeit zu lesen (als primitive Typen).
In Byte ist Byte (ebenso wie kurz, int und lang) nur ein signierter numerischer Datentypen. Dies bedeutet jedoch keinen Verlust von Daten, wenn sie als unsignierte Binärdaten behandelt werden. Wie Ihre Abbildung zeigt, ist 10000000
-128
als vorzeichenbehaftete Dezimalzahl. Wenn Sie mit binären Daten zu tun haben, behandeln Sie sie einfach als binäre Form und Sie werden in Ordnung sein.
Tags und Links java bit-manipulation