Wie liest man vorzeichenbehaftete int aus Bytes in Java?

8

Ich habe eine Spezifikation, die liest, dass die nächsten zwei Bytes int signiert sind.

Um das in Java zu lesen, habe ich folgendes

Wenn ich einen signed int in Java mit dem folgenden Code lese, erhalte ich einen Wert von 65449

Logik für die Berechnung von unsigned

%Vor%

Ich glaube, das ist falsch, denn wenn ich und mit 0xff bekomme ich ein unsigned Äquivalent

Also habe ich die & amp; 0xff und die unten angegebene Logik

%Vor%

Ich habe versucht, diese Werte mit der Art und Weise, wie die Spezifikation liest, zu vergleichen, aber das sieht falsch aus. Da fällt die Größe des Heap nicht darunter.

Was ist der richtige Weg für die signierte int-Berechnung in Java?

Hier geht's zur Spezifikation

somespec() { xtype 8 uint8 xStyle 16 int16 }  xStyle: Eine vorzeichenbehaftete ganze Zahl, die einen Offset (in Byte) vom Anfang dieser Widget () - Struktur zum Anfang einer xStyle () - Struktur darstellt, die ererbte Stile für vom Widget definierte Seiten sowie Stile ausdrückt, die speziell für dieses Widget gelten .

    
Siva 23.08.2011, 08:00
quelle

5 Antworten

13

Wenn Sie einen vorzeichenbehafteten 16-Bit Wert haben, wollen Sie short und int ist 32-Bit, der auch die gleichen Werte enthalten kann, aber nicht so natürlich.

Es scheint, dass Sie einen kleinen 16 Bit-Wert für den Endian-Wert möchten.

%Vor%

oder

%Vor%

BTW: Sie können ein int verwenden, aber es ist nicht so einfach.

%Vor%

oder

%Vor%     
Peter Lawrey 23.08.2011, 08:14
quelle
4

Angenommen, Byte [1] ist das MSB und Byte [0] ist das LSB, und Sie möchten, dass die Antwort eine 16-Bit-Ganzzahl mit Vorzeichen ist:

%Vor%

Dann um eine vorzeichenbehaftete 32-Bit-Ganzzahl zu erhalten:

%Vor%

Übrigens sollte die Spezifikation angeben, welches der beiden Bytes das MSB ist und welches das LSB ist. Wenn nicht und wenn es keine Beispiele gibt, können Sie es nicht implementieren!

Irgendwo in der Spezifikation wird es sagen, wie ein "int16" dargestellt wird. Füge diesen Teil ein. Oder fügen Sie einen Link zu der Spezifikation ein, damit wir sie selbst lesen können.

    
Stephen C 23.08.2011 08:15
quelle
2

Schauen Sie sich DataInputStream.readInt() an. Sie können entweder von dort aus einen Code eingeben oder einfach DataInputStream verwenden: Umschließen Sie damit Ihren Eingabestream und lesen Sie die eingegebenen Daten einfach.

Für Ihre Bequemlichkeit ist dies der Code:

%Vor%     
AlexR 23.08.2011 08:11
quelle
2

Ich kann es jetzt nicht kompilieren, aber ich würde es tun (angenommen, byte1 und byte0 werden vom Byte-Typ übernommen).

%Vor%

Wenn byte1 und byte0 Intets sind, müssen Sie das '& amp; 0xFF

machen

UPDATE, weil Java den Ausdruck eines if zu einem Booleschen

macht     
SJuan76 23.08.2011 08:11
quelle
1

Haben Sie eine Möglichkeit, eine korrekte Ausgabe für eine bestimmte Eingabe zu finden? technisch gesehen ist eine int-Größe 4 Bytes, also können Sie mit nur 2 Bytes das Vorzeichen-Bit nicht erreichen.

    
Michael Litvin 23.08.2011 08:16
quelle

Tags und Links