Variablen short <-> byte[]

hasso

Mitglied
Hallo,

ich versende Daten via serieller Schnittstelle und muss daher alles in byte Arrays umrechnen, komm damit aber nicht so wirklich klar.

Habe auf der einen Seite:

Java:
short length = 1153;
byte[] message = new byte[2];

message[0] = (byte)(length & 0xFF);
message[1] = (byte)((length >> 8) & 0xFF);

Das klappt soweit, das Array beinhaltet -127 und 4 für 0x0481 was 1153 entspricht.
Nach dem Versenden fehlt mir aber die Idee wie ich daraus wieder ein Short bekomme. Hab es mit dem ByteBuffer probiert:

Java:
ByteBuffer bb = ByteBuffer.allocate(2);
bb.put(message[0]);
bb.put(message[1]);
short length = bb.getShort();

Da fliegt dann aber eine Exception mit dem Inhalt "null".
Mir fehlt da bei Java irgendwie das Verständnis, da wird es irgendwo nicht passen bzgl. BE oder LE oder auch signed und unsigend. Wie kriege ich das denn wieder vernünftig zurück in ein short ? Kann auch ein Integer sein.

Viele Grüße
 

Michael...

Top Contributor
Wie versendest Du denn? Kommt auch tatsächlich alles an? Und warum nutzt Du nicht den umgekehrten Weg den Du bei der Wandlung von short zu byte[] gehst?
 

D4rkscr43m

Bekanntes Mitglied
du musst das Umwandeln in ein byte[] einfach umdrehen:
aus
Java:
message[0] = (byte)(length & 0xFF);
message[1] = (byte)((length >> 8) & 0xFF);

wird dann
Java:
short s = 0;
s = message[0]; // autocast weil short > byte
s = (short) (s | message[1] << 8) // cast weil short | byte zu int wird
 

hasso

Mitglied
Wie versendest Du denn? Kommt auch tatsächlich alles an? Und warum nutzt Du nicht den umgekehrten Weg den Du bei der Wandlung von short zu byte[] gehst?

Ja, kommt alles an.

Ich hätte den umgekehrten Weg gerne gemacht, wusste aber nicht wie man das zu einem short dann zusammenbaut. D4rksc43m hat es dann ja beschrieben, mir war der Konkatenierungsoperator ("|") nicht bekannt :)
 
S

SlaterB

Gast
@D4rkscr43m
komisch, den Rückcode habe ich zuerst auch probiert und finde ihn öfters im Internet,
aber er funktioniert doch nicht?
wie im ersten Post schon steht ist hier message[0] negativ, -127,
das macht später den ganzen short negativ

die zweite Variante in meinem Code macht es etwas besser:
Java:
public class Test2 {
    public static void main(String[] args)  {
        short length = 1153;
        byte[] message = new byte[2];
        System.out.println(Integer.toHexString(length));
        System.out.println(Integer.toBinaryString(length));

        message[0] = (byte)length;
        message[1] = (byte)((length >> 8) & 0xFF);
        System.out.println(Arrays.toString(message));

        short k = message[1];
        k = (short)(message[0] | (k << 8));
        System.out.println("k: " + k + " - " + Integer.toHexString(k) + " - " + Integer.toBinaryString(k));

        short k3 = message[1];
        k3 = (short)((message[0] & 0xFF) | (k3 << 8));
        System.out.println("k3: " + k3 + " - " + Integer.toHexString(k3) + " - " + Integer.toBinaryString(k3));
    }
}
 
S

Spacerat

Gast
Mit einem hat Marco13 schon mal recht: getShort(0) sollte gehen. Wobei ich nicht weis, was er mit Shift+OR meint. ;)
Sicher ist jedoch, dass die Exception fliegt, weil die Bufferposition nach dem Schreiben am Ende des Buffers steht. Will man nun ein Element lesen, muss man entweder Marcos Methode oder vorm lesen [c]bb.rewind()" verwenden.
Erfahrungsgemäss sag' ich mal, das es sich ausserdem loht, für selbst angelegte Buffer die ByteOrder stets festzulegen, statt sich darauf zu verlassen, dass alle Systeme die selbe native Byteorder haben. Wenn man sich dann mal in irgendwelchen Bitshifts verhaspelt hat, kann man einfach die ByteOrder ändern oder im überall dort, wo man sich verhaspelt hat, im Code rumwühlen.
Ansonsten kann man sich Bitshifts ohnehin sparen, wenn man Buffer richtig verwendet:
Java:
// vom DatenStream:
data = new byte[2];
dataStream.read(data);
ByteBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
short s = bb.readShort();

// zum DatenStream:
data = new byte[2];
ByteBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
bb.putShort(s);
dataStream.write(data);
[EDIT]
du musst das Umwandeln in ein byte[] einfach umdrehen:
aus
Java:
message[0] = (byte)(length & 0xFF);
message[1] = (byte)((length >> 8) & 0xFF);

wird dann
Java:
short s = 0;
s = message[0]; // autocast weil short > byte
s = (short) (s | message[1] << 8) // cast weil short | byte zu int wird
Bei dem autocast wird auch das Negativ-Flag erweitert. Für das 2er-Komplement würde das bedeuten, dass alle höherwertigen Bits bereits 1 vom Wert her also -128 sind. Ein anschliessendes ODER mit anderen Werten würde an dem Ergebnis nichts mehr ändern.
Java:
short s = 0;
s = (short) (message[0] & 0x00FF); // autocast weil short > byte
s = (short) (s | message[1] << 8) // cast weil short | byte zu int wird
Bei der umgekehrten Wandlung dagegen, kann man sich die AND-Verknüpfung sparen.[/EDIT]
[EDIT]BTW.: Mich wundert's im übrigen zunehmend, warum es immernoch keine Streams gibt, die auf "java.nio" basieren. Das wäre nicht blos um einiges bequemer, DataIn- und Output würden grösstenteils auch entfallen.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

D4rkscr43m

Bekanntes Mitglied
[TIPP]Der Beitrag kann ignoriert werden :)[/TIPP]

0x00FF ist übrigens == 0xFF

Nope, das macht einen Unterschied, den ich vorher auch nicht bedacht habe.
((byte)-1) im byte ist 11111111 also 0xFF
((byte)-1) im short ist 0000000011111111 also 0x00FF und ist danach 255
aber -1 == (byte)-1 == (byte)0xFF != (0x00FF)

Java:
short s = (byte)0xFF, s2 = 0x00FF;
System.out.println(s);
System.out.println(s2);

ich verstrick mich da etwas und es ist nicht so ersichtlich was ich meine, ich hoffe trotzdem, dass es irgendwie ankommt :)
 
Zuletzt bearbeitet:
S

Spacerat

Gast
0x00FF ist übrigens == 0xFF
Full acknowledge... Ich mach' das aus Gewohnheit so. So hat man eine gewisse Übersicht über gelöschte oder gesetzte Bits. Glücklicherweise verstösst man damit ja nicht gegen irgendwelche (wie hiessen diese Dinger doch gleich? Ahhh, ja...) Konventionen. ;) Ausserdem hat D4rksc3am dadurch seinen Fehler auch gleich gesehen, auch wenn's bei 'ner AND-Verknüpfung trotzdem egal ist, ob man 0en voran stellt, schliesslich ist's mindestens 'ne int-Operation.
[EDIT]@SlaterB: Nein, du irrst dich nicht. [c]((byte) -1 & 0xFF)[/c] sind auf jeden Fall [c]255 (int)[/c][/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> ich hoffe trotzdem, dass es irgendwie ankommt

häh? ne, bei mir kommt nix an ;)
wenn du das eine auf (byte) castest, und das andere nicht, musst du dich über Unterschiede nicht wundern,

bei
Java:
        short s = (byte)0xFF, s2 = (byte)0x00FF;
        System.out.println(s);
        System.out.println(s2);
wäre wieder alles gleich

meine Aussage ist: wo immer 0x00FF im Quellcode steht, kann man auch 0xFF
oder meinetwegen anscheinend auch 0x0000000000000000000000000000000000000000FF schreiben,

hat höchstens kommentierenden Charakter, immerhin,
oder irre ich mich?
 

hasso

Mitglied
Da entstand ja viel Diskussion nachdem ich schon zufrieden war :)

Hier mal mein Code wie es jetzt problemlos funktioniert (musste D4rkscr43ms Code noch etwas ändern), isn Einzeiler geworden:

Java:
short length = (short)(((short)((message[1] & 0xFF) << 8)) | ((short)(message[0] & 0xFF)));

Man muss halt recht viel casten und ist vlt bisschen unübersichtlich :)
Spannend ist das Java beim verODERn von zwei short ein int draus macht ?!


EDIT: Wieso stellt er den Code so zusammengequetscht dar ?
 

D4rkscr43m

Bekanntes Mitglied
das meiste Casten kannste dir sparen:
Code:
short length = (short)(((message[1] & 0xFF) << 8) | (message[0] & 0xFF));
 

hasso

Mitglied
Hast recht, hatte es vorher aufgeteilt in zwei short für das high-byte und das low-byte und es erst dann verODERt. Da sind die inneren Casts mit reingerutscht beim zusammenfügen :oops:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
U short[] nach byte[] Java Basics - Anfänger-Themen 11
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
N Problem mit Datentyp short, byte Java Basics - Anfänger-Themen 2
O Datentypen Volle 16 Bit eines Short für flags Abfrage nutzen Java Basics - Anfänger-Themen 11
MiMa Datentyp Short Wert zuweisen über Methode Java Basics - Anfänger-Themen 2
B Probleme beim einlesen einer short variablen für einen Array Java Basics - Anfänger-Themen 1
M Input/Output Viele short aus Datei lesen und von Little Endian zu Big Endian umwandeln Java Basics - Anfänger-Themen 12
S Primitiver Datentyp Short , Vorteil/Nachteil Betrachtung Java Basics - Anfänger-Themen 6
D Von short zu Ascii-Code Java Basics - Anfänger-Themen 2
F BufferedImage aus short[][][] Java Basics - Anfänger-Themen 3
E JAVA Typ Short mit String ergänzen Java Basics - Anfänger-Themen 6
H Typ short: Exponent und Modulo Java Basics - Anfänger-Themen 3
S Char Array Werte in short variablen speichern Java Basics - Anfänger-Themen 4
F Short Array zu String Java Basics - Anfänger-Themen 2
H short in unicode umwandeln Java Basics - Anfänger-Themen 5
Z Frage zu "short" Java Basics - Anfänger-Themen 6
M Aus einem Array von "bytes" ein "short" Java Basics - Anfänger-Themen 4
S short in String umwandeln ? Java Basics - Anfänger-Themen 3
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
P int zu byte Java Basics - Anfänger-Themen 8
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
S byte to float Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
V unsigned byte? Java Basics - Anfänger-Themen 27
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
D [jni] jbytearray <-> byte array Java Basics - Anfänger-Themen 8
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
T Datentypen unsigned byte? Java Basics - Anfänger-Themen 9
G Integar zu Byte Java Basics - Anfänger-Themen 4
P Byte mit 0...255? Java Basics - Anfänger-Themen 5
N Datentypen Fehler beim Umwandeln in byte Java Basics - Anfänger-Themen 3
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
L Datentypen 250 und byte? Java Basics - Anfänger-Themen 4
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
H Datentypen Byte-Array RSA Java Basics - Anfänger-Themen 9
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
V Byte -> String -> Byte verlustfrei Java Basics - Anfänger-Themen 12
Hindi93 Byte to Int Java Basics - Anfänger-Themen 4
H Datentypen byte[] to int Java Basics - Anfänger-Themen 9
S hex zu byte Java Basics - Anfänger-Themen 4
M Byte Array: Werte größer 127? Java Basics - Anfänger-Themen 11
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
H 1 Byte Status Variable Java Basics - Anfänger-Themen 3
P Datentypen Byte und char Typecast Java Basics - Anfänger-Themen 2
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
W Datentypen int -> byte Java Basics - Anfänger-Themen 2
H Datentypen Byte-Array aus Stream lesen Java Basics - Anfänger-Themen 3
F Typenumwandlung byte <=> int verstehen Java Basics - Anfänger-Themen 3
S Byte eines arrays Java Basics - Anfänger-Themen 17
N Frage zu Datentyp byte Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben