vorzeichenbehaftete Interpretation

mario.nemi78

Mitglied
Hallo.

Ich steig gleich wieder aus!! ;)

Also folgendes Verständisproblem in Sachen Java. Ich lese eine Datei binär byte für byte ein. Soweit so gut. Nun benötige ich allerdings die "echten" Werte der einzelnen Bytes und nicht die Interpretation als Datentyp byte, da der ja vorzeichenbehaftet ist und am 128 ins negative rutscht.

Nun hab ich versucht (so wie ich es aus ANSI C kenne) die mich interessierenden 4 bytes aus der Datei entsprechend in einen 32bit integer zu schieben um dann den entsprechenden Gesamtwert zu erhalten - den ich benötige. Das "kopieren" in den integer sollte vorzeichenunabhängig erfolgen... dachte ich zumindest...

Java:
...
FileInputStream dateiname = new FileInputStream (fileName);
BufferedInputStream daten = new BufferedInputStream (dateiname);

  byte[] _4byte = new byte[4];
  
  //die ersten vier bytes lesen
  daten.read(_4byte);

  dateigroesse = _4byte[0];
  dateigroesse = dateigroesse << 8;
  dateigroesse = dateigroesse | _4byte[1];
  dateigroesse = dateigroesse << 8;
  dateigroesse = dateigroesse | _4byte[2];
  dateigroesse = dateigroesse << 8;
  dateigroesse = dateigroesse | _4byte[3];

...

In meinem Fall ist _4byte[3] zum Beispiel 9C also als byte genau -100. Leider behält JAVA diese interpretation auch bei bitoperationen offenbar bei, denn auch der integer ist dann -100, was mist ist, weil eigentlich sollte er 156 sein.

Und nu? Zurück zu ANSI C der wahren Programmiersprache...:toll:
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Sollte sowas wie
Code:
dateigroesse = dateigroesse | (_4byte[1] & 0xFF);
sein, damit die Vorzeichen weggeundet werden.
 

Marco13

Top Contributor
Das 8. Bit wird ja nicht weggelassen, sondern nur die davor. Eine negative Zahl ist (wegen 2er-Komplement-Darstellung) immer sowas wie
1111111 (...<32 1en...) 111101001

Wenn man die zu einem int dazu-ORt, wird auch der int negativ. Mit dem &0xFF werden nur die untersten 8 bit genommen (dass eines davon ein Vorzeichen wäre, spielt ja keine Rolle).

Ggf. kannst du auch deinen inputStream in einen DataInputStream stecken, und direkt einen int rauslesen - musst aber gucken, ob das mit der Endianness passt (und im Zweifelsfall kannst du den readInt-Code aus dem DataInputStream klauen und an die andere Endianness anpassen :D )
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen

Neue Themen


Oben