# Antwort des Server richtig interpretieren



## Dit_ (10. Jun 2011)

Hallo!

Folgendes Problemchen!

Ich bekomme vom Server eine Zeichnekette (4 Zeichen ganz genau)
Die Zeichen werden als Vierecke dargestellt...

Laut Beschreibung soll das eine float32 Zahl sein und stellt Zeit in Milisek. dar.

wenn ich jedes Zeichen zu byte umwandle bekomme ich ein array der Form * [0, -8, -60, 69]*, die Zeit stimmt aber nicht. Die Antwort kommt jede Sekunde und als Zeit bekomme ich (Bsp) 00:02:30, 00:01:20, 00:02:10, 00:00:30 usw ganz unterschiedlich also, sollte aber immer um 1 Sekunde größer sein.

Hat jem Idee was ich da falsch mache?

P.S. so Wandle ich bytearray zu Int (im inet gefunden...)

```
public static int byteArrayToInt(byte[] b) {
        int value = 0;
        for (int i = 0; i < 4; i++) {
            int shift = (4 - 1 - i) * 8;
            value += (b[i] & 0x000000FF) << shift;
        }
        
        return value;
    }
```

Danke schon mal!

gruß


----------



## SlaterB (10. Jun 2011)

jetzt verrate doch einfach mal die mehreren byte-Arrays, die die Sekundenabstände darstellen sollen,
wenn auf
[0, -8, -60, 69]
als nächstes
[0, -8, -60, 70]
folgt, dann wäre das doch ziemlich gut, dann liegt der Fehler offensichtlich in deinem Restcode

leider verrätst du nicht wie die mehreren Arrays aussehen, so dicht an der Quelle wie es dir möglich ist 
(auch [0, -8, -60, 69] ist natürlich schon irgendwie interpretiert),

ich persönlich schaue übrigens erst morgen wieder rein, nicht auf mich warten


----------



## Murray (10. Jun 2011)

Wie bekommst Du die Daten vom Server? Ist da irgendwo eine String-Repräsentation im Spiel (vielleicht durch einen InputSteamReader)? Die Formulierung "ich bekomme eine Zeichenkette" klingt fast so.
Wenn das wirklich einfach nur vier Bytes sind, dann sind das Binärdaten, und die darf man nicht einfach als Zeichen interpretieren.
Du hast hier nur ein Array gepostet - wie sehen denn die aus, die in den Sekunden danach kommen?
Und wie kommst Du vom Array auf die geposteten Zeiten (00:02:30 usw)?


----------



## Dit_ (11. Jun 2011)

ich bekomme eine Zahl die durch mit 4 bytes kodiert wird. diese Zahl repräsentiert die Anzahl der Millisekunden anzahl der Millisekunden kann man leicht in sekunden bzw minuten bzw. stunden umrechen.


----------



## HoaX (11. Jun 2011)

Im ersten Post schreibst du float32, das ist dann kein Int, sondern bestimmt IEEE753!?
Die oben genannten 4 Bytes würden dann 6303 ergeben.


----------



## Empire Phoenix (11. Jun 2011)

Wenns nen float ist, verscuh mal  nen DataInputStream auf das Arrayzukleben(über ytearrayintput stream) und dann ReadFloat()
Wenn das ergebniss dann stimmt kann das noch bischen weiterbearbeitet werden. (Mir gefällt die idee nur begrenzt pro Sekunde nen DataInputStream zu erstellen)


----------



## Dit_ (12. Jun 2011)

Ok hier ist der Auszug aus der Dokumentation.







Bekomme die Daten per UDP die dann erstmal als rohDaten in Form eines String habe. Weiss aber nicht wie ich die Int32 bzw float32 richtig umwandle...


----------



## tfa (12. Jun 2011)

Vielleicht hilft [c]Float.intBitsToFloat(bits)[/c]


----------



## Michael... (12. Jun 2011)

Dit_ hat gesagt.:


> Bekomme die Daten per UDP die dann erstmal als rohDaten in Form eines String


Sicher, dass die Daten als String ankommen oder ist es eher so, dass Du die Daten als String ausliest?
In ersterem Fall bietet zumindest die Klasse Integer eine parse Methode an um Stringsrepräsentationen in ein int umzuwandeln. Bei Float müsste ich erst einmal nachdenken.
In zweiten Fall würde ich diese daten direkt als Bytes auslesen und interpretieren.


----------



## Dit_ (13. Jun 2011)

ok ähnliche Frage.

ich habe ein bytearray Länge 2, es soll in int16 umgewandelt werden?

Wie mache ich das?
also

bytearray[0] ist = -16
bytearray[1] = 0;

Ich weiss das Integer soll = 240 sein. 
240 ist ja bytearray[0] & 0xFF ... was ist mit arraybyte[1]?


----------



## Michael... (13. Jun 2011)

Du kannst das Array mit Bitverschiebung und Bit Operationen in einen int überführen.
Ich nehme mal an, dass das höchstwertige Byte an letzter Stelle im Array steht, daher muss das Array rückwärts durchlaufen werden.

```
byte[] b = {-16, 0};
	int binValue = 0;
	for (int i=b.length-1; i>=0; i--) {
		binValue <<= 8;
		binValue |= b[i]&0xFF;
	}
	System.out.println(binValue);
```


----------

