Falls es huckleberry nicht klar ist:
Nicht "EVTL.", sondern "IMMER" davor "-128" (=0x80) rechnen, wenn auch nur 1 Wert über 0x7F / 127 möglich sein soll!
Sonst weißt du nachher nie ob z.B. 0x03 nun eine 3 oder 3+128=131 sein soll.
Funktioniert ein cast (byte)(217)?
Dann müsste der cast (byte)(217) == (byte)(-39) das selbe ergeben?!
Wenn's so ist, dann kann man sich -128 wohl sparen.
(Ich hab ich nie getestet, und war der Meinung, es müsste craschen.
Lerne aber gerne dazu.)
Dann stellt sich nur noch für Ausgabe die Frage, wie das eigentliche Problem am elegantesten umgesetzt werden kann:
gewagte differenzierende Anerkennung,
nachdem du dich vorher mit mir unterhalten hast und ich auch
System.out.println()
kodiert hatte
von Ausgabe als Kommentar direkt dahinter sagt deine Signatur nichts
Kann mir bei der Gelegenheit jemand erklären, wozu dieser "dirty hack" gut sein soll? Ich dachte, die JVM rechnet intern sowieso mit mindestens 4 Byte langen Werten - egal ob byte, short oder eben int.
was soll denn ein hack sein? Daten als byte 'zu haben' ist schon ein wichtiger Schritt allgemein,
wenn man sie an Streams schicken will oder was auch immer,
hier von String aus zwingender Schritt, auch bei int wie man sieht nicht ganz ohne,
wobei man theoretisch mit int gut im byte-Bereich arbeiten könnte
OutputStream hat dann auch eine Methode write(int b)
Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream.
The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.
Java hat nunmal keine "unsigned bytes" - insofern erscheint mir der Versuch, Werte größer 127 in ein byte speichern zu wollen, als kein sonderlich guter Stil, der sich leicht vermeiden liese, indem man sofort ints nimmt. Und meines Wissens nach - siehe obiger Beitrag - besitzen bytes keine Vorteile gegenüber ints.
nun, bytes haben den famosen Vorteil, dass alle Computer der Welt danach ihr Fähnchen hängen,
wenn du eine Datei lesen/ schreiben bzw. dich irgendwie außerhalb des Java-Sandkasten-abgeschlossen-Arbeitsspeicher bewegst,
musst du dich schlicht danach richten, mag mehr Notwendigkeit als Vorteil sein,
Ok, ich habe mich wohl undeutlich ausgedrückt. Also nochmal:
Mir ist es völlig wurscht, ob die JVM die Elemente als signed, unsigned, 4 Kilo Äpfel oder eine Sahnetorte interpretiert. Wenn ich ein 0xFF in ein byte [] reinschiebe, dann soll dort 0xFF stehen und ich möchte keine Fehlermeldung.
es sollte dich schon interessieren, welchen Wertebereich byte hat und ob die Werte durch das Casten geändert werden..,
naja, wenn es wichtig ist wird es irgendwann schon auffallen
falls dir deine Codezeile zuviel Schreibarbeit ist und noch öfter ähnliches kommt, könntest du dir eine Methode mit int... als beliebig langen Parameter definieren, intern ein byte[] erstellen und zurückgeben,
dann sieht es so aus:
die Methode könnte auch prüfen, ob die Einzelwerte zumindest zwischen 0 und 255 liegen, egal wie dann auf byte abgebildet,
und für andere ne Fehlermeldung ausgeben
Wenn du gesichert für "00" den Wert 0x00 in deinem Feld haben willst, und für "FF" den Wert 0xff =255d, dann musst du doch ein bisschen Grips reinstecken (ein bisschen).
Denn es ist eine Ding 255 Werte (irgendwie) eindeutig zu codieren, aber es ist ganz anderes Ding das identische BitMuster im Byte zu erzwingen. (Ohne Fallunterscheidung gehts nicht)
Das geht in Java aber nicht; eine Variable vom Typ byte kann nicht den Wert 255 enthalten. Du kannst dir lediglich - wie SlaterB vorgeschlagen hat - eine (bijektive!) Funktion schreiben, die dir Integer-Werte im Bereich 0 bis 255 auf eine Variable vom Typ byte abbildet.
Sinnigerweise solltest du aber dann aber auch die dazu inverse Funktion haben, um mit den Werten weiterarbeiten zu können.
@AquaBall:
Die Bitmuster sind doch im Zweierkomplement bereits ident.
Als int: 0xFF = 255 (d) = 1111 1111 (b)
Nach einem Cast zum Byte: -1 (d) = 1111 1111 (b)
Nur die Interpretation ist eine andere, da sich das MSB ändert. Bei der ersten Ziffernfolge wäre das MSB 0 (da die ersten 24 Stellen mit Nullen aufgefüllt sind), also wird die Zahl als positive Zahl interpretiert. Die zweite Zahl hat nur acht Stellen (da vom Typ Byte), d. h. die erste Stelle ist eine 1 und wird folglich als negative Zahl interpretiert. Aber die Bitmuster sind - wenn man sich auf die letzten acht Stellen beschränkt - jeweils die gleichen.
Die Bitmuster sind doch im Zweierkomplement bereits ident.
Als int: 0xFF = 255 (d) = 1111 1111 (b)
Nach einem Cast zum Byte: -1 (d) = 1111 1111 (b)
Nur die Interpretation ist eine andere, da sich das MSB ändert.
Genau das mein' ich auch: Wenn er die Daten wieder lesen will (Wozu sonst speichern), dann kommt er um eine Fallunterscheidung nicht herum, weil sich die Interpretation ändert.