Java und vorzeichenlose Werte

8

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?

    
stackoverflow 02.01.2013, 20:55
quelle

3 Antworten

11
  

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

    
Jon Skeet 02.01.2013, 20:58
quelle
7

Nein, du verlierst das 8. Bit nicht. Aber leider hat Java zwei "Features", die es schwieriger machen, mit solchen Werten umzugehen:

  • all seine primitiven Typen sind signiert;
  • beim "Entpacken" eines primitiven Typs in einen anderen primitiven Typ mit einer größeren Größe (z. B. Lesen eines 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:

übersetzt wird %Vor%

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

    
fge 02.01.2013 21:03
quelle
2

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.

    
Code-Apprentice 02.01.2013 20:59
quelle

Tags und Links