Java Integer Array in unsigned Byte Array umwandeln

fanatiXalpha

Fleet Admiral
Registriert
Aug. 2011
Beiträge
13.707
nAbend allerseits,

wie im Titel genannt hab ich ein Integer Array welches in ein unsigned Byte Array umgewandelt werden soll
das int [] besteht aus 8 Bytes
Bin bei Typenumwandlung nicht so fit und das was ich im Internet gefunden hatte, hat nicht das gewünschte Ergebnis gebracht :/

danke schon Mal für die Hilfe :)
 
Es gibt in Java kein unsigned!

Riecht mir aber eher nach einer Hausaufgabe.

Jetzt darfst du gerne überlegen das in Java selber umzusetzen.
 
Ja, das hatte ich auch im Internet gelesen gehabt
in einem Codeteil steht aber als Kommentar (der Codeteil kommt dementsprechend nicht von mir) "convert signed byte to unsigned byte and store in int"
bedeutet das, man stellt es einfach nur als unsigned dar, es ist aber kein unsigned oder wie wäre das dann zu verstehen?

jain, ist keine Hausaufgabe sondern teil eines Projektes
aber ich kann mir schon denken, dass du solche Sachen sehr eng siehst und da keine Unterscheidung machst

Wenn mir keinerlei Hilfe geben willst, bis auf den Hinweis am Anfang, wieso dann überhaupt die Mühe zu antworten?
 
Beantworte zuerst folgende drei Fragen:
- wie viele unsigned Datentypen gibt es in Java?
- Welchen Zahlenbereich kann ein signed und ein unsigned Byte darstellen (unabhängig von Java)?
- Was ist der Hauptunterschied zwischen einem signed und unsigned Byte, wenn man es sich binär anschaut?
 
ohne nochmal nachzuschauen:

- Java unterstützt scheinbar gar kein unsigned wenn ich es richtig verstanden habe
- unsigned Byte: 0 bis 255 und signed von -127 bis 128 da ein Bit für das Vorzeichen reserviert ist
- uff, das weiß ich jetzt gerade nicht bzw. will es mir nicht einfallen falls es noch in meinem Kopf sein sollte....
 
Zuletzt bearbeitet: (unsigned statt Java geschrieben)
Lass mich die letzte Frage anders formulieren:
Wie unterscheiden sich die Zahlen -12 und 244, wenn diese in einem Byte gespeichert werden?
 
Genau, 244 und -12 sind binär identisch. Nur der Mensch hinter der Maschine weiß, dass die Daten entweder als signed Byte (-12) oder unsigned byte (244) interpretiert werden sollen.

Gehen wir mal von der Annahme an, dass aus einer anderen Datenquelle/Programm/Datei/... ein unsiged Byte in einem Byte an dein Java Programm gelesen werden soll. Du bekommt von Java den Wert -12 als byte geliefert, was müsstest du machen, damit die Zahl 244 raus kommt?
 
Zuletzt bearbeitet:
entsprechend maskieren, damit die vorderen 1er wegfallen und er damit den Bytewert als 244 interpretier
oder?

was ich nicht erwähnt hatte und eigentlich wichtig ist, ist folgendes
in dem Integer-Array wird keine Zahl größer sein als 255
und dennoch, wenn ich dann ein Element aus dem Array nehme und als Byte caste, dann passiert folgendes:

int = 171
byte = -85

zumindest in der Ausgabe

in der doc von Oracle hatte ich noch von der Methode byteValue() gelesen, aber das hat auch nich funktioniert...
 
Zuletzt bearbeitet:
Den Grund dafür hast du gerade selber ausführlich erörtert ;)

Wie viele Bits brauchst du zur Darstellung der Zahl 171? Wie viele Bits bietet dir ein Byte? Wie lautet dementsprechend das most significant bit des Bytes?
 
171 sind 1010 1011 in binär
1 Byte sind 8 Bits
das MSB wäre in diesem Fall 1

ich weiß wieso ich diesen Teil der Informatik hasse :D

okay, ich weiß jetzt wieso das Problem besteht, aber ich hab immer noch keinen Plan wie ich das beheben soll
weil mit 0xFF maskieren geht nicht, da 0xFF ja ebenfalls außerhalb des Bereichs wäre...
 
Zuletzt bearbeitet:
"171 sind 1010 1011 in binär". Stimmt. Wo ist dabei das Vorzeichen-Bit?

Erinnere dich an den Kommentar im Quelltext:
fanatiXalpha schrieb:
"convert signed byte to unsigned byte and store in int"

Warum denkst du, muss das gemacht werden?

@VikingGe: Danke für den Hinweis mit dem "most significant bit". Hatte schon vergessen, wie das hieß. :)
 
Naja, die Zahl ist negativ, wenn du sie so interpretierst. Du hast aber keinerlei Information verloren.

Solange du deine Zahlen darstellen kannst, ist es ziemlich egal, wie du sie darstellst. Du könntest auch nen String nehmen und "百七十一" reinschreiben - dann dreht deine Ausgabe völlig durch, aber du weißt, dass das 171 heißt. Du musst nur eben wissen, wie du das ganze in eine Darstellung überführst, mit der auch Java damit was anfangen kann, und wenn eine Zahl irrtümlicherweise als signed-Wert interpretiert wird, obwohl du unsigned erwartest, dann musst du eben den Bereich erweitern (z.B. auf int oder short) und dafür sorgen, dass eben die höherwertigen Bits alle 0 sind.

Auf deutsch: eben doch mit 0xFF maskieren, wie du es ja schon geschrieben hattest. Aber nicht das Byte, denn das hat da natürlich keinen Effekt - sondern erstmal das Byte zu einem int casten und dann die Maske anwenden.
0xFFFFFFAB & 0x000000FF = ? ;)
 
fanatiXalpha schrieb:
- Java unterstützt scheinbar gar kein unsigned wenn ich es richtig verstanden habe
Nicht ganz.

Genau genommen ist char ein 16-bit unsigned integer.
char wird aber hauptsächlich verwendet, um Zeichen als UCS-2 (je nach Java-Version auch UTF-16) abzulegen.
 
Integer hat in dem Sinne auch kein Vorzeichen. Man weiß durch die Bezeichnung int einfach nur, wie die Darstellung auszusehen hat, also wie die bits interpretiert werden müssen!
hast du schonmal probiert was passiert, wenn du einen int auf den maximal möglichen wert setzt und dann um 1 erhöhst?
Ich glaube das Bild erklärt die Funktion ganz gut: http://www.gk-informatik.de/hw/grafik/zahlkreis_z.png
 
Zurück
Oben