Zahlendarstellung in Java

Jey

Mitglied
Hi!

Ich hab folgendes Problem: Ich bastle grad an ner Klasse, die mir veschiedene Variablen in Byte-Arrays umwandelt. Sinn und Zweck des Ganzen sei jetzt mal dahingestellt ^^!

Jetzt kann es sein, dass ich eine Variable als Int übergebe, allerdings nur als Short (also als Byte-Array mit zwei Elementen) zurückgegeben möchte. Siehe folgende Methode:

Code:
	public static byte[] getUnsignedShort(int value) {
		return new byte[] {
				(byte) ((value & 0xFF)),
				(byte) ((value >> 8) & 0xFF)
		};
	}

Mein Problem:
Sobald ich weniger als die für Int typischen 4-Bit haben möchte, geht mein >Vorzeichen< flöten! Woran kann's liegen? Wie ist so ne Int aufgebaut, Zweierkomplement nehm ich mal an? Ich komm einfach nicht auf die Lösung -.-!


Hoffe auf Hilfe und vielen Dank schon mal!

Grüße,
Jey
 

port29

deus.Server
Hi,

also der einzige Sinn einer solchen Operation wäre meiner Meinung nach die Cryptographie oder die binäre Übertragung von Daten an einen Mikrocontroller. Aber das ist jetzt erstmal nebensächlich.

Ich würde an deiner Stelle etwas anders an die Sache rangehen und zwar nicht mit int sondern mit der Integer Klasse, denn diese hat die Methode toBinaryString implementiert.
 

Jey

Mitglied
Übertragung ja, Mikrocontroller nein :)!

Oh, die Funktion erspart einem das umrechnen ^^. Ist allerdings für meine Zwecke leider ungeeignet. Jedoch interessant zu sehen, was Java mit einer Zahl anstellt, wenn man eni Vorzeichen davorsetzt:

42 -> 101010
-42 -> 11111111 11111111 11111111 11010110

Ich könnte bei der Wiederherstellung einer negativen Short einfach die ersten zwei Bytes mit 1en ergängen, bräuchte dann jedoch wohl ein zusätzliches Bit für das Vorzeichen. Ist unschön und hat dann auch nichts mehr mit Zweierkomplement zu tun..
Sieht wohl ganz so aus, als ob ich mich statt shorts auf unsigned word einstellen sollte, denn so wie ich das sehe, lässt sich kein negativer integer zuverlässig wieder herstellen, wenn man ihn in 2 byte quetscht.

Oder aber ich nehm den Datentyp Short. Sollte funktionieren. Ich werd's mal probieren..

Danke für den Typ, hat was in meinem Kopf ins Rollen gebracht ^^!
 

zeja

Erfahrenes Mitglied
Nimm doch nen ByteBuffer, da mußt du noch weniger denken:
Java:
public static byte[] getUnsignedShort(short value) {
		return ByteBuffer.allocate(Short.SIZE/Byte.SIZE).putShort(value).array();
	}

Du kannst sogar die ByteOrder einstellen. Ganz praktisch wenn man mit Low-Level Prozessen kommuniziert.
 

Jey

Mitglied
Denken ist böße, gell ;)?

Ist ein interessanter Ansatz. Beinhaltet im Prinzip das, an was ich gerade arbeite, jedoch ohne die Trennung zwischen Konatiner und Werkzeug, die ich drin hab. Ich werde es mal in Betracht ziehen!

Danke für die ganzen Tips, bin jetzt etwas schlauer als vorher :)! Ich lass das Thema mal offen, falls mir noch die eine oder andere Frage einfallen sollte. An sonsten denke ich, dass ich jetzt genug Material hab, um mich allein durchzubeißen.

Danke vielmals & Grüße,
Jey
 

Jey

Mitglied
Ok, also negative Shorts zu schreiben ist definitiv nur möglich, wenn man eine Short und keine Integer als Ausgangspunkt nimmt. Das als kleines Abschlusswort. Klappt alles so weit, wache den Thread jetzt zu!

Nochmals vielen Dank für die Tips & Anregungen!