Verschiebeoperatoren - manchmal falsche Ergebnisse

Status
Nicht offen für weitere Antworten.
K

Karl123

Gast
Hallo,
seit einiger Zeit versuche ich Big-Endian in Little-Endian zu konvertieren.
Nun glaubte ich eine Lösung gefunden zu haben: mit Verschiebeoperatoren.

Nach ausgiebigem Test musste ich leider feststellen, dass manchmal falsche Werte geliefert werden.

Wo liegt der Fehler und wie kann ich ihn eliminieren?

Hier mein Programm mit einem der wenigen Werte, der falsch berechnet wird:

Code:
public class LendianShort
{
        public static void main(String[] args)
        {
          int i = 18953;
          String hex = Integer.toHexString(i);

          System.out.println("hex = "+hex);
          System.out.println("hexLittleEndian = "+Integer.toHexString(swabInt(i)));
          	String hexLE = Integer.toHexString(swabInt(i));
          	String hexLEShort = hexLE.substring(0,4);
          
          System.out.println("hexLEShort = "+hexLEShort +" i="+i);
          
        }

        public final static int swabInt(int v) {
                return  (v >>> 24) | (v << 24) | ((v << 8) & 0x00FF0000) | ((v >> 8) &
0x0000FF00);
        }
}

Kommentar: Die Dezimalzahl 18953 liefert die hex-Zahl 4a09 (Big Endian). Die entsprechende Little-Endian-Zahl sollte 094a lauten. Geliefert wird die fehlerhafte Zahl 94a0. Möglicherweise hängt das Problem mit der führenden Null zusammen.
Leider finde ich nur sehr spärlich Literatur zur Arbeitsweise der o.g. Vergleichsoperatoren. Daher kann ich das Beispiel nicht im Detail nachvollziehen.
Ausserdem gibt es kein Short.toHexString, daher der Umweg über Integer.

Ein ähnliches Beispiel findet sich unter http://www.codeguru.com/java/articles/366.shtml. Es arbeitet ebenso unkorrekt.
 

Ark

Top Contributor
Wie viele Bits willst du denn verdrehen? Willst du alle Bytes in einem int oder alle in einem short umdrehen? Oder nur die unteren 16 Bits eines ints umdrehen, als wäre es ein short?

Code:
// alle in int umdrehen
int alt = irgendwas;
int umgedreht = alt << 24 | (alt & 0xFF00) << 8 | (alt & 0xFF0000) >>> 8 | alt >>> 24;

// alle in short umgedreht
short alt = irgendwas;
short umgedreht = alt >>> 8 | alt << 8;

// untere 16 Bit in int ist identisch mit allen in short
Ungetestet!

Ark
 
K

Karl123

Gast
Ich möchte erreichen, daß short-Zahlen (Wertebereich -32768 bis +32767), welche als Dezimalzahlen mit Vorzeichen eingegeben werden, als Little-Endian (String) ausgegeben werden.

Hierzu ein weiteres Beispiel:

Eingabe: 30540

Ausgabe Big-Endian (String) wäre: 77 4c
Ausgabe Little-Endian (String): 4c 77

Also, die beiden Bytes werden vertauscht.

Es soll noch eine elegantere Methode geben, bei der ich es leider nicht schaffe, sie in mein Programm einzubauen:

// nio access to little-endian binary float data
float f = ByteBuffer.wrap( array ).order( ByteOrder.LITTLE_ENDIAN ).getFloat();
Quelle: http://mindprod.com/jgloss/endian.html

Gut dokumentierte Beispiele lassen sich im Internet leider nicht finden.
 
S

shad0w

Gast
Das geht so:

Code:
short s = 18953;
short rev = Short.reverseBytes(s);

System.out.printf("%04x\n",s);
System.out.printf("%04x\n",rev);
 
K

Karl123

Gast
Danke shad0w für die kurze und elegante Methode die short-Bytes zu vertauschen.

Doch wie kann ich jetzt aus "short rev" einen "String rev" machen? Es gibt ja kein "Short.toHexString" sondern nur "Integer.toHexString".
 
K

Karl123

Gast
Ich kann nach meiner alten Methode "short" über "integer" via "Integer.toHexString" in den gewünschten Hex-String umwandeln.

Doch dann gehen mir wieder die führenden Nullen verloren, was bei der weiteren Verarbeitung zu Fehlern führen würde.

Wie kann ich die führenden Nullen erhalten?

Code:
public class LendianShort2
{
        public static void main(String[] args)
        {
        short s = 18953;
	short rev = Short.reverseBytes(s);

	int revInt = (int)rev;
	String hex = Integer.toHexString(revInt);
	
	System.out.printf("%04x\n",s);
	System.out.printf("%04x\n",rev);
	System.out.println(hex);
	
	}

Ausgabe:

4a09
094a
94a (falsch, gewünscht ist 094a als String)
 
S

SlaterB

Gast
mit String.format() kannst du auch einen String erstellen statt nur eine Konsolenausgabe
 
K

Karl123

Gast
Prima! Danke SlaterB für den Hinweis!

So funktioniert die Umwandlung, wie ich sie brauche:

Code:
public class LendianShort2
{
        public static void main(String[] args)
        {
        short s = 18953;
	short rev = Short.reverseBytes(s);

	String hex = String.format("%04x\n",rev);
	
	System.out.printf("%04x\n",s);
	//System.out.printf("%04x\n",rev);
	System.out.println(hex);
	
	}


}

Ergebnis:

4a09
094a (jetzt als Hex-String)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Operationen auf Bitebene und Verschiebeoperatoren wichtig? Java Basics - Anfänger-Themen 26
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
T PNG Datei wird nur manchmal geöffnet Java Basics - Anfänger-Themen 6
C JOptionPane tritt manchmal bei Plugin in den Hintergrund Java Basics - Anfänger-Themen 2
Z Lottoprogramm - Zeigt manchmal nur 5 Zahlen statt 6 an? Java Basics - Anfänger-Themen 4
O if and else geht nur manchmal Java Basics - Anfänger-Themen 17
S Werte aus SingeltonKlasse sind manchmal =0 &manchmal !=0 Java Basics - Anfänger-Themen 1
A Wieso erscheinen die Objekte manchmal und manchmal nicht Java Basics - Anfänger-Themen 2
Q Compiler-Fehler Javaprogramm wird manchmal nicht ausgeführt? Java Basics - Anfänger-Themen 4
T manchmal gehts, manchmal nicht???? Java Basics - Anfänger-Themen 25
Developer_X Componente werden manchmal nicht angezeigt. Java Basics - Anfänger-Themen 8
X Java Eclipse Version: 3.4.1 meldet manchmal keine Fehler Java Basics - Anfänger-Themen 17
G manchmal Objekt machmal nicht Java Basics - Anfänger-Themen 2
B Warum manchmal public class und manchmal nur class Java Basics - Anfänger-Themen 3
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
L Falsche Methode wird geladen Java Basics - Anfänger-Themen 2
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
T Input/Output Falsche Eingabe ausgeben Java Basics - Anfänger-Themen 3
R StringBounds falsche Ergebnisse Java Basics - Anfänger-Themen 5
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
T Falsche Ausgabe ???? Java Basics - Anfänger-Themen 13
S Falsche Ausgabe Java Basics - Anfänger-Themen 6
M Input/Output ISBN Leser - falsche Eingabe ausgeben Java Basics - Anfänger-Themen 2
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
R Methoden Switch wählt das Falsche Java Basics - Anfänger-Themen 17
K Falsche Methode Java Basics - Anfänger-Themen 3
J Falsche Darstellung von Float Java Basics - Anfänger-Themen 2
M Falsche Eingabe wiederholen lassen Java Basics - Anfänger-Themen 2
W Methoden Falsche Felder von Methode belgegt Java Basics - Anfänger-Themen 14
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Falsche Werte bei Zeitmessungen Java Basics - Anfänger-Themen 7
Helgon Falsche Zeichen im Text Java Basics - Anfänger-Themen 10
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
G Bubblesort - Falsche Sortierung Java Basics - Anfänger-Themen 6
D Kriege falsche MD5 Java Basics - Anfänger-Themen 12
R run ->eclipse ruft falsche Programme auf Java Basics - Anfänger-Themen 5
D p q formel gibt zum Teil falsche Werte aus Java Basics - Anfänger-Themen 5
S Falsche Version? Java Basics - Anfänger-Themen 2
C Falsche Zeit Java Basics - Anfänger-Themen 2
V Falsche Augabe Java Basics - Anfänger-Themen 16
C Klammern einlesen!!! Falsche Ausgabe!!!! Java Basics - Anfänger-Themen 4
S Falsche Reihenfolge von Methodenaufrufen Java Basics - Anfänger-Themen 8
H Falsche Eingabe über try-catch abfangen Java Basics - Anfänger-Themen 2
L Datenbankanbindung ODBC falsche pfadangabe? Java Basics - Anfänger-Themen 3
O Falsche Bed. (ein überlauf) seh den Fehler aber nicht. Java Basics - Anfänger-Themen 3
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
S Falsche Ausgabe Java Basics - Anfänger-Themen 3
L Wegen TableSorter wird falsche Zeile einer Tabelle gelöscht? Java Basics - Anfänger-Themen 2
G falsche Version Java Basics - Anfänger-Themen 3
L Falsche Umsetzung von MVC, brauche Hilfe Java Basics - Anfänger-Themen 6
D Tabelle -> Daten eingeben -> Falsche erhalten Java Basics - Anfänger-Themen 9
S Falsche Ausgabe? Java Basics - Anfänger-Themen 2
F Falsche Daten aus Datei Java Basics - Anfänger-Themen 2
G Falsche Java befehle, doch was ist falsch? Java Basics - Anfänger-Themen 9
C falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
M Falsche do-Schleife? Java Basics - Anfänger-Themen 4
E falsche Ausgabe Java Basics - Anfänger-Themen 7
D Falsche Datumsausgabe? Java Basics - Anfänger-Themen 5
J erhalte falsche Kalenderwoche - wo ist der Fehler? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben