# unsigned byte Problem



## Big_Daddi (18. Sep 2009)

Halli Hallo,

ich habe auch ein unsigned Byte Problem, jedoch konnte ich bis jetzt noch nichts passendes finden.

Ich bekomme via UDP einen String mit unsigned Bytewerten. Jetzt hab ich das Problem dass eben negative Zahlen dabei raus kommen und vorallem mehr bytes verarbeitet werden als gesendet werden.

Wireshark sagt folgendes:

```
Data (17 bytes): 68 0a 0a 68 0a 71 01 90 a5 13 .....
```

Mein Javaprogramm hat folgenden Code:

```
...
byte [] bytearray = receivedstring.getBytes(); //receivedstring=String mit den Empfangenen Daten
Sytem.out.println(bytearray.length);  
...
```
ByteArray.length = 23 ??????????????????
Die Einzelnen Bytes in int:
104 10 10 104 10 113 1 -17 -65 -67 -17 19 ...

Mein gedanke war, dass ich als Datentyp short nehme, aber woher weiß das programm, dass jetzt plötzlich 2 bytes genutzt werden zu einem shortwert gehören?????

Gruß


----------



## SlaterB (18. Sep 2009)

warum sollte das Programm das wissen müssen,
du bist doch der Programmierer, wenn du zwei bytes zusammenfassen willst, dann tue das

bisher scheint mir das aber nicht nötig,
die Byte-Serien entsprechen einander, 
die 90 oben ist Hexedizal = 9*16 = 144, da Java-bytes signed sind gehts nur bis 127, ergo wird die 144 als -17 dargestellt = 127-144, 
wenn es nicht genau passt dann +-1 usw, genau anschauen und die Formel finden,

das einzige, das dann noch überrascht, ist die Länge der Bytes, 17 zu 23,
von dir auch mit einigen Fragezeichen gewürdigt, sogar in rot,
allerdings hast du nicht beide Serien in voller Länge gepostet, so dass man dazu gar nix sagen kann,
vielleicht sind die letzten 6 bytes 0?


----------



## Big_Daddi (18. Sep 2009)

ja das ist mir schon klar aber schau mal den String genauer an:

90 = -17 -65
a5 = -67 -17
13 = 19

Das ist mein Problem, wie ich das realisieren kann, bzw. wie der auf diese Zahlen von 90 u. a5 kommt. Das -17 versteh ich auch noch aber warum macht java dann daraus 2 bytes???


----------



## SlaterB (18. Sep 2009)

hast recht, diese Unregelmäßigkeit fiel mir nicht auf,
da kann ich dann erstmal nicht weiterhelfen,

allgemeiner Notfall-Tipp wäre: alle Zahlen von 0-255 schicken lassen und genau anschauen wie jeder einzelne Wert interpretiert wird,
vielleicht ist dann ein System zu erkennen, ansonsten byte für byte einzeln mappen,

aber hoffe es findet sich noch ne angenehmere Erklärung 

und eine Richtung habe ich dann doch noch:
wie ist überhaupt der Weg von UDP bis in den String? warum werden die Bytes als Java-String-Unicode-Zeichen interpretiert?
wenn du nur bytes an sich einliest, dann entfallen evtl. Encoding-Umwandlungen


----------



## maki (18. Sep 2009)

IMHO kommt der Fehler daher dass du vesuchst die Bytes in einem String zu speichern.
Java verwendet intern UTF-8, da werden manchmal mehr als ein Byte pro Character verwendet.


----------



## Big_Daddi (18. Sep 2009)

Stimmt eigentlich, in meiner UDP-Funktion speicher ich .getData() in einen String! Aber wenn ich des dort nicht in eine String variable sondern in eine Short Variable speicher müsste es doch gehen oder??
Wenn ja, dumme frage, aber wie lös ich des dann??

Jetzt hab ich es so:

```
String datareceive = new String(data.getData(),0,data.getLength);
```


----------



## SlaterB (18. Sep 2009)

das ist getData()? doch wohl ein byte-Array,
dieses kannst du in einer byte[]-Variablen speichern, was bezweckst du mit dem String?


----------



## Big_Daddi (18. Sep 2009)

Das mit dem String war einfach nur so von anfang an als ich des ganze noch getestet habe. also nicht fix.

Aber wenn ich jetzt das ganze nicht als String sonden in ein byte-Array speichere bin ich doch genau so weit wie vorher!?!?! wenn dann müsste ich ich es in ein short-Array speichern, wenn das geht?


----------



## SlaterB (18. Sep 2009)

ob es was bringt, ist erst zu klären,
bisher hast du
byte[]-Sender (Länge 17) -> byte[] Empänger (Länge ?) -> String -> byte[] aus String, Länge 23

die Aussage der letzten Posts ist nun, dass der String durch seine Eigenarten für die komischen Bytes sorgen kann,
das ? in der Kette könnte 17 sein, 
also: kein String und nochmal alles testen, gehts nun?


----------



## Big_Daddi (18. Sep 2009)

Jepp daran lags. -> byte[] Empfänger (Länge 17) ->
jetzt klappt es. ich speicher des ganze jetzt gleich in ein bytearray und nicht in einen String!

DANKESCHÖN!!


----------

