Datentypen Byte geht nicht höher als 126 auch nicht mit casten?

xJan45x

Aktives Mitglied
Guten Abend,
Ich programmiere zurzeit mein kleines Homecockpit. Und sende mir über mein Mirkocontroller die Geschwindigkeit die ich über ein Drehknopf wähle. Ich muss aber um die Daten an mein Flug Simulator zu übertragen ein Byte haben. Also der Byte ist nachher der Wert der im FS(flug simulator) angezeigt wird.
Code:
                String[] value = line.split(":");
                String finalStr = value[1];
                byte[] b = new byte[1];
                b[0] = (byte)Integer.parseInt(finalStr);
line ist der Scanner der das Ausliegt gibt: "Speed:0 bis 409" zurück. Dann Spiltten damit ich nur denn zweiten wert habe. Ich caste hier denn Byte damit ich höher als 128 gehen kann. Aber bei ca. 126 geht der im minus bereich weiter. zb:
Code:
0
1
50
100
126
-118
-101
-81
-74
0
4
5
....
Wo ran liegt das?

Mfg Jan.
 

InfectedBytes

Top Contributor
ein byte ist nunmal nur ein byte groß.
Mit deinen zehn fingern kannst du auch nicht bis 1 million zählen.
Wenn du erwartest größere Werte zu haben, musst du eben einen anderen Datentyp nutzen, z.B. short oder int
 

xJan45x

Aktives Mitglied
ein byte ist nunmal nur ein byte groß.
Mit deinen zehn fingern kannst du auch nicht bis 1 million zählen.
Wenn du erwartest größere Werte zu haben, musst du eben einen anderen Datentyp nutzen, z.B. short oder int
Das ist mir auch klar. Aber die Methode writeDataToFS(int offSet, int mode, byte[] value); braucht ein byte[] und wenn ich kann kein int[] zum byte[] oder int zum byte[] casten. Wie soll ich es dann machen?
 

InfectedBytes

Top Contributor
Das ist mir auch klar. Aber die Methode writeDataToFS(int offSet, int mode, byte[] value); braucht ein byte[] und wenn ich kann kein int[] zum byte[] oder int zum byte[] casten. Wie soll ich es dann machen?
dann sag das doch gleich^^

Du sollst ein byte array senden, vermutlich soll das array eben aus mehr als nur einem byte bestehen.
Da ein int aus 4 byte besteht, kannst du ihn eben in einem byte array der größe 4 unterbringen:
Java:
public static final byte[] intToByteArray(int value){
    return new byte[]{(byte)(value >>>24), (byte)(value >>>16), (byte)(value >>>8), (byte)value};
}
 

xJan45x

Aktives Mitglied
dann sag das doch gleich^^
Java:
public static final byte[] intToByteArray(int value){
    return new byte[]{(byte)(value >>>24), (byte)(value >>>16), (byte)(value >>>8), (byte)value};
}
Ja sorry, ich denke endweder habe ich was falsch geschrieben oder du hast was falsch verstanden. Denn die Methode braucht ein Byte[] das ist richtig aber ich muss dieses Byte ja "füttern" mit b[0] = Wert; und dort muss es ja ein Byte sein und kein Byte[]. Oder wo muss die die methode anwenden?

So sieht das nun aus:
Code:
                String[] value = line.split(":");
                byte[] b = new byte[1];
                b[0] = intToByteArray(Integer.parseInt(value[1])); //Geht nicht ist kein Byte sondern ein Byte[]
              
                fsuipc_wrapper.WriteData(0x07E2, 1, b);
 

Thallius

Top Contributor
Du must halt deinen Wert in zwei oder vier Bytes umrechnen. Wieviel genau erwartet werden können wir nicht wissen, das sollte in den Docs zu der Funktion stehen. Ebenfalls wichtig wäre noch ob die Bytes in Little oder Bigendian geschrieben werden müssen....
 

InfectedBytes

Top Contributor
Ja sorry, ich denke endweder habe ich was falsch geschrieben oder du hast was falsch verstanden. Denn die Methode braucht ein Byte[] das ist richtig aber ich muss dieses Byte ja "füttern" mit b[0] = Wert; und dort muss es ja ein Byte sein und kein Byte[]. Oder wo muss die die methode anwenden?

So sieht das nun aus:
Code:
                String[] value = line.split(":");
                byte[] b = new byte[1];
                b[0] = intToByteArray(Integer.parseInt(value[1])); //Geht nicht ist kein Byte sondern ein Byte[]
             
                fsuipc_wrapper.WriteData(0x07E2, 1, b);
anstatt
Java:
byte[] b = new byte[1];
 b[0] = (byte)Integer.parseInt(finalStr);
eben einfach
Java:
byte[] b = intToByteArray(Integer.parseInt(value[1]));
 

xJan45x

Aktives Mitglied
eben einfach
Java:
byte[] b = intToByteArray(Integer.parseInt(value[1]));
Das Problem ist nicht das erstellen ich brauche nur 1 Wert im Byte diesen erstelle ich mit byte b = new byte[1] und b[0] das ist der Wert der die Geschwindigkeit im Flug SImulator ändert. Und diesen muss ich irgendwie mit einer Zahl über 128 füllen. Im Internet steht casten aber das funktioniert nur konstanten Zahlen aber die Zahl ändert sich ja so bald ich am Drehknopf drehe.
 
K

kneitzel

Gast
Also Du kannst doch an den mathematischen Grundlagen nichts ändern! Byte ist nun einmal nur 8 Bit. Man könnte sich noch überlegen, dass man statt einem signed byte (-128 - 127 als Wertebereich) ein unsigned byte nimmt. Dafür gibt es mehrere Möglichkeiten, wie man das in Java abbilden könnte da Java halt ein unsigned byte in dem Sinne nicht kennt. Aber damit ist man dann bei einem Wertebereich von 0 - 256. Auf die 409 kannst du einfach nicht kommen!

Das ist als ob Du ein kleines Kinderfahrrad hast und nun verzweifelt versuchst, damit 1t Kies zu transportieren. Wir erzählen dann noch was von Anhänger und so, aber du willst 1t Kies in deiner Hosentasche transportieren. Die passen da nicht rein! Also wenn dann mehrfach fahren (=Array, viele kleine Ladungen) aber über die kleinen Hosentaschen müssen wir nicht diskutieren :)
 

xJan45x

Aktives Mitglied
Also Du kannst doch an den mathematischen Grundlagen nichts ändern! Byte ist nun einmal nur 8 Bit. Man könnte sich noch überlegen, dass man statt einem signed byte (-128 - 127 als Wertebereich) ein unsigned byte nimmt. Dafür gibt es mehrere Möglichkeiten, wie man das in Java abbilden könnte da Java halt ein unsigned byte in dem Sinne nicht kennt. Aber damit ist man dann bei einem Wertebereich von 0 - 256. Auf die 409 kannst du einfach nicht kommen!

Das ist als ob Du ein kleines Kinderfahrrad hast und nun verzweifelt versuchst, damit 1t Kies zu transportieren. Wir erzählen dann noch was von Anhänger und so, aber du willst 1t Kies in deiner Hosentasche transportieren. Die passen da nicht rein! Also wenn dann mehrfach fahren (=Array, viele kleine Ladungen) aber über die kleinen Hosentaschen müssen wir nicht diskutieren :)

Okay. Danke
Dann bleibt mir ja keine andere Wahl als denn Typen anzuschreiben der diese Library entworfen hat. Irgendwie muss es ja eine Lösung dafür geben. Trotzdem danke euch :)
 

Thallius

Top Contributor
Nein das geht natuerlich aber Java ist eine denkbar ungünstige Sprache dafür und man sollte natuerlich wissen wie ein Hexadezimales Zahlensystem funktioniert.

Da Du das wahrscheinlich nicht weist schreibe ich ausnahmsweise mal den Code hierhin auch wenn Du dadurch überhaupt nichts lernst. Der Code ist aber ungetestet und sollte nicht einfach nur abgeschrieben werden.

Code:
String valueString = XXXX // Deine Value aus dem String also 0 - 409
int value = Integer.parseInt(valueString) // gibt Dir die Zahl als Integer

// Nun zerlegen wir die Zahl in zwei Bytes die man maximal braucht um eine Zahl bis 409 in Hex darzustellen. Da Java keine unsinged byte kann, benutzen wir zunächst int damit wir bis 256 rechnen können
// Als Beispiel 257 würde zerlegt in zwei unsigned Bytes mit den Werten high 0xFF und low 0x02.
int highByte = value/256;
int lowByte = value-highByte*256;
// nun packen wir diese beiden int in ein byte Array
byte[0] = (byte) lowByte;
byte[1] = (byte) highByte;
// Hier ist es jetzt wichtig zu wissen ob der Empfänger mit Little- oder Bigendian arbeitet. Das bestimmt in welcher Reihenfolge Du die Bytes beschreiben musst. Also wenn das so nicht klappt, dann must du es vertauschen in
byte[1] = (byte) lowByte;
byte[0] = (byte) highByte;
// unter Umständen verlangt der Empfänger sogar noch mehr bytes. Du sprachst von 4 bytes. Dann must du halt byte[2] und byte[3] auch noch füllen. Aber auch hier gilt es kann dann sein, dass die leeren Bytes am Anfang oder am Ende des Array stehen können. Das must du entweder ausprobieren oder versuchen in der Doku herauszufinden

Gruß

Claus
 
K

kneitzel

Gast
Die Frage ist, wieso der TE meint, dass der Wert in genau einem Byte gesendet werden muss. Wenn er davon so überzeugt ist, dann muss das doch einen Grund haben. Ich habe in der Vergangenheit auch schon einmal ein "Binary Protokoll" erstellt und da war dann ganz klar definiert, was wie zu senden war. Spricht ein oder zwei byte war dann sozusagen ein Befehl und dann war klar, was wie übertragen werden muss. Und dann war halt angegeben, was da an Daten folgen musste.
Sowas würde ich da auch erwarten.

Ich habe hier absolut keinen Überblick. Es ist angesprochen, dass es um "Geschwindigkeit" geht. Aber wenn es um die Steuerung eines Flugzeuges geht, dann stelle ich doch den Schub ein, oder?
Und was bedeutet denn da dann eine 409? Evtl. ist es tatsächlich nur ein byte. Wenn es wirklich um Geschwindigkeit geht, dann wäre denkbar, dass diese nur auf die 10er genau ist. Dann wäre ein byte von 1 evt. 10 km/h / m/s / was auch immer. Oder wenn es um Schub geht, dann ist es evtl. ein Prozentwert. Dann ist 1 gleichbedeutend mit 1% Schub. 100 wäre volle Leistung. Oder es wäre ein Prozentsatz x/128 oder x/256.

Die Details müssen irgendwo beschrieben sein. Wenn ich Daten von a nach b übermittel, dann wird es da ein Protokoll geben, das klar macht, was da übermittelt wird.
 

xJan45x

Aktives Mitglied
Also im Offset Blatt steht das so:
Offset | Size | Use
0x07E2 2 Autopilot airspeed value, in knots

Size ist wahrscheinlich die Angabe wie groß das Byte Array sein muss. Denn es gibt auch manche Offset wo 4 steht
 
K

kneitzel

Gast
Das ist dann doch die fehlende Beschreibung. Bezüglich der Reihenfolge findet man zwar jetzt keine Angabe, aber das findet sich evtl. noch an anderer Stelle.

Und damit hast Du die Lösung doch im Post von Thallius.
 

xJan45x

Aktives Mitglied
Nein das geht natuerlich aber Java ist eine denkbar ungünstige Sprache dafür und man sollte natuerlich wissen wie ein Hexadezimales Zahlensystem funktioniert.

Da Du das wahrscheinlich nicht weist schreibe ich ausnahmsweise mal den Code hierhin auch wenn Du dadurch überhaupt nichts lernst. Der Code ist aber ungetestet und sollte nicht einfach nur abgeschrieben werden.

Code:
String valueString = XXXX // Deine Value aus dem String also 0 - 409
int value = Integer.parseInt(valueString) // gibt Dir die Zahl als Integer

// Nun zerlegen wir die Zahl in zwei Bytes die man maximal braucht um eine Zahl bis 409 in Hex darzustellen. Da Java keine unsinged byte kann, benutzen wir zunächst int damit wir bis 256 rechnen können
// Als Beispiel 257 würde zerlegt in zwei unsigned Bytes mit den Werten high 0xFF und low 0x02.
int highByte = value/256;
int lowByte = value-highByte*256;
// nun packen wir diese beiden int in ein byte Array
byte[0] = (byte) lowByte;
byte[1] = (byte) highByte;
// Hier ist es jetzt wichtig zu wissen ob der Empfänger mit Little- oder Bigendian arbeitet. Das bestimmt in welcher Reihenfolge Du die Bytes beschreiben musst. Also wenn das so nicht klappt, dann must du es vertauschen in
byte[1] = (byte) lowByte;
byte[0] = (byte) highByte;
// unter Umständen verlangt der Empfänger sogar noch mehr bytes. Du sprachst von 4 bytes. Dann must du halt byte[2] und byte[3] auch noch füllen. Aber auch hier gilt es kann dann sein, dass die leeren Bytes am Anfang oder am Ende des Array stehen können. Das must du entweder ausprobieren oder versuchen in der Doku herauszufinden

Gruß

Claus

Bohr wirklich tausend dank. Klaus! Funktioniert problemlos. Eine Frage hätte ich da noch wenn ich ein 4 byte Array übergeben muss. Muss ich dann wieder durch zwei teilen also so?:
Code:
byte bytes = new bytes[4];
bytes[0] = (byte)lowByte;
bytes[1] = (byte)highByte;
bytes[2] = (byte)lowByte /2;
bytes[3] = (byte) highByte/2;
Bin zwar noch nicht so weit im meinen Homecockpit. Aber das wird später auch kommen
 

Flown

Administrator
Mitarbeiter
Also normalerweise löst man int -> byte[] -> int mit einem ByteBuffer. Da braucht man sich auch keine Sorgen über die Konvertierung/Rechnerei/etc. zu machen.
Java:
int i = 409;
ByteBuffer buffer = ByteBuffer.allocate(4 /* int hat 4 bytes -> 32 bits */).putInt(i);
byte[] bytes = buffer.array();
System.out.println(Arrays.toString(bytes));
int j = ByteBuffer.wrap(bytes).getInt();
System.out.println(j);
 

Thallius

Top Contributor
Also normalerweise löst man int -> byte[] -> int mit einem ByteBuffer. Da braucht man sich auch keine Sorgen über die Konvertierung/Rechnerei/etc. zu machen.
Java:
int i = 409;
ByteBuffer buffer = ByteBuffer.allocate(4 /* int hat 4 bytes -> 32 bits */).putInt(i);
byte[] bytes = buffer.array();
System.out.println(Arrays.toString(bytes));
int j = ByteBuffer.wrap(bytes).getInt();
System.out.println(j);

und woher weiß der ByteBuffer ob Little oder Bigendian?

Gruß

Claus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
J NumberFormatException bei String->byte[] Allgemeine Java-Themen 12
ARadauer Blob aus byte Array erstellen? Allgemeine Java-Themen 3
T Object -> byte[] Allgemeine Java-Themen 5
G Byte[] zeichenweise lesen Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
B int -> byte Allgemeine Java-Themen 2
G file --> byte[] Allgemeine Java-Themen 7
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
I String -> byte[] -> String Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue int in byte Allgemeine Java-Themen 18
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
E String -> byte[] Allgemeine Java-Themen 6
C Byte[] to String Allgemeine Java-Themen 7
D datei in byte[]-array schreiben Allgemeine Java-Themen 6
D byte[] problem Allgemeine Java-Themen 3
MQue ArrayList in ein byte- Array Allgemeine Java-Themen 7
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
J byte-Array als String übers http schicken Allgemeine Java-Themen 8
F List<String> zu byte[] Allgemeine Java-Themen 7
L byte vs. int Allgemeine Java-Themen 6
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
N Byte-Code entschlüsseln (Bitmasks?) Allgemeine Java-Themen 3
R byte - string? Allgemeine Java-Themen 10
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
B boolean array = byte array (platzverbrauch) Allgemeine Java-Themen 6
L byte[] to int Allgemeine Java-Themen 2
M Vector zu einem byte[] Allgemeine Java-Themen 5
C Byte Array aus Datei erzeugen Allgemeine Java-Themen 6
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2
B Problem mit Einlesen vom Byte FF aus Dateien Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben