Konvertiere 3 Bytes nach int in Java

8
  1. Ich möchte Bytes in int in Java konvertieren. Ich möchte annehmen, dass Bytes vorzeichenlose Bytes sind. Angenommen, wenn

    %Vor%

    r sollte 255 nicht -1 in Dezimal sein.

  2. Dann möchte ich Int-Wert von 3 Bytes erstellen. Angenommen, wenn

    %Vor%

    Dann sollte r 0x000FFFFF sein. Byte b1 wird an der höheren 3. Position platziert und Byte b3 wird an der unteren 1. Position im int-Wert platziert. Auch mein b1 wird von 0x00 bis 0x0F reichen, und andere Bytes werden von 0x00 bis 0xFF sein, wobei angenommen wird, dass Bytes nicht vorzeichenbehaftet sind. Wenn Byte b1 größer als 0x0F ist, extrahiere ich nur die untersten 4 Bits. Kurz gesagt möchte ich Int aus 3 Bytes extrahieren, aber nur 20 Bits von 3 Bytes verwenden. (insgesamt 16 Bits von b2 und b3 und 4 untersten Bits von b1). int r muss positiv sein, da wir aus 3 Bytes erstellen und eine vorzeichenlose Natur von Bytes annehmen.

UDPLover 31.10.2012, 09:23
quelle

5 Antworten

3

Sie müssen hier vorsichtig mit der Zeichenerweiterung umgehen - leider sind Bytes in Java signiert (soweit ich weiß, hat das nichts als Kummer verursacht).

Sie müssen also etwas maskieren.

%Vor%     
harold 31.10.2012, 09:31
quelle
3

Ich würde annehmen, dass Sie vorzeichenlose Bytewerte wollen

%Vor%

Jedes Byte muss maskiert und zu den richtigen Bits verschoben werden.

    
Peter Lawrey 31.10.2012 09:34
quelle
2

Dies ist mit Bitshift-Operatoren und binären AND ziemlich einfach. Sie möchten nur die unteren 4 Bits von b1 verwenden, das ist genau das, was b1 & 0x0F tut. Der ganze Rest verschiebt die Bits zu verschiedenen Positionen

%Vor%

BEARBEITEN wie @harold darauf hingewiesen hat, hätte die vorherige Lösung (ohne die 0xFF-Maske auf den unteren Bytes) zu Anomalien aufgrund der Zeichenerweiterung geführt ...

EDIT2 Gosh, ich bekomme immer die Nase vom Operator-Vorrang, wenn es um diese geht ...

Empfohlener Wert:

ppeterka 31.10.2012 09:27
quelle
1

Hier ist eine "shift only" Version:

%Vor%

Das Verschieben nach links 28 Bit schneidet die oberen 4 Bits ab, dann das Verschieben nach rechts 12 bringt es zurück zu einer Netto 16 Bit Linksverschiebung.

Ich habe diesen Code getestet und es funktioniert:)

    
Bohemian 31.10.2012 09:26
quelle
0

Ich habe einige Antworten verglichen, da ich neugierig war, welcher der schnellste war.

Scheint so, als ob Bohemian's Methode am schnellsten ist, aber ich kann nicht erklären, warum es im ersten Lauf um 11% langsamer ist.

PS .: Ich habe die Antworten nicht auf Richtigkeit überprüft.

Hier der Code:

%Vor%

AUSGABE

%Vor%     
mike 21.08.2013 11:40
quelle

Tags und Links