# Bytemasken bei Datenübertragung



## Uhm (5. Apr 2009)

Hallo, ich benutze grad einen Netzwerkcode (UDP) von anderer Stelle und verstehe ihn leider wider Erwarten doch nicht vollständig.
1, Wozu muss ich lower und higher Byte definieren und wofür brauch ich das?
2, allgemein: Was passiert hier? Ich kenn mich mit den unären Operatoren grundsätzlich aus, das hier versteh ich trotzdem nicht :/

[highlight=Java]
//ok, ein Buffer mit 256 * 8 Bits. Alles klar soweit.
byte[] buffer = new byte[256];
// Warum sollte das highbyte je kleiner als 0 sein, und was würde das bedeueten? 
// Wenn es kleiner als 0 ist, dann wird hier offensichtlich das Byte bis zum Rand mit // 1en befüllt, richtig?
int highByte = (buffer[0] < 0) ? buffer[0] + 256 : buffer[0];
int lowByte = (buffer[1] < 0) ? buffer[1] + 256 : buffer[1];
// ?
int length = (highByte << 8) | lowByte;[/highlight]

und hier:

[highlight=Java]
int length = string.length();
// man holt sich das erste Byte des length Integers.. warum?
int lowByte = length & 0xFF;
// ?
int highByte = ((length - lowByte) >> 8) & 0xFF;
byte[] buffer = new byte[256];
buffer[0] = (byte) highByte;
buffer[1] = (byte) lowByte;[/highlight]


----------



## SlaterB (5. Apr 2009)

die ersten beiden bytes ergeben zusammen einen Zahlwert, eine Information, welche hier irgendeine Länge enthält,
diese Information wird zum einen extrahiert, zum anderen codiert,

eine Besonderheit ist die Intepretation eines Bytes, das kann je nach Verständnis eine Zahl zwischen 0 und 256 sein (UDP-Sicht)
oder zwischen -128 und 127 (Java-Sicht)

Beispiel:
im UDP-Paket steht Länge 5320 = 256 * 20 + 200 = byte 20 + byte 200 -> im Java byte-Array 20 und -56

um aus 20 und -56 die eigentlich gemeinte Zahl 5320 auszurechnen, 
müssen erst beide Werte in richtige vorzeichenlose bytes umgerechnet (20 + 200) und dann zusammengezählt werden

bei Speicherung einer anderen Länge gehts wieder zurück


----------



## Uhm (5. Apr 2009)

Verstehs noch immer nicht richtig, angenommen ich will den String "hallo" in Byte[] umwandeln, dazu brauche ich anscheinend bei einer UDP Verbindung ein lowByte und highByte um die Länge des nachfolgenden Packets vorrauszuschicken. (wiewohl ich diese Information nirgends finden konnte, ein UDP Header hat laut wikipedia Quellport, Zielport, Länge und eine Prüfsumme. - keine Rede von nur low oder highByte (= nur Länge).

Das Codieren ist mir jetzt klar, beim Dekodieren fällt mir aber kein Fall ein wie das highByte, also der buffer[0] jemals kleiner als 0 sein kann. Immerhin codiere ich das highbyte ja mit einer positiven Integerzahl... (der Länge des zu übermittelnden Wertes, was immer zumindest >=0 ist).
Sollte es dann kleiner als 0 sein, warum würde ich dann +256 dazurechnen? Es könnte ja sein dass -10 drinnen steht, dann würde es nicht reichen nur +256 zu rechnen wie ich das verstanden habe.

*Danke auf jeden Fall, du hast mir jetzt schon weitergeholfen *


----------



## SlaterB (5. Apr 2009)

> Immerhin codiere ich das highbyte ja mit einer positiven Integerzahl..

die negativ gespeichert werden kann,
bis 127 gehts noch, aber 130 kann in einem byte nicht mehr dargestellt werden, 130 = -126 oder so

> Es könnte ja sein dass -10 drinnen steht, dann würde es nicht reichen nur +256 zu rechnen wie ich das verstanden habe.

wieso nicht? du bist jetzt wieder beim Dekodieren, wo die -10 eigentlich für eine hohe positive Zahl > 128 steht, die in ein byte nicht passt,
also + 256 -> 246, was soll daran nicht reichen?


----------



## Uhm (5. Apr 2009)

Danke dir, jetzt ist mir die ganze Bytegeschichte endlich klar !


----------

