Mal wieder vergleichen von Strings.[Leider noch ein Problem]

Status
Nicht offen für weitere Antworten.

Yezariael

Mitglied
Hallo allerseits,

auf die Gefahr hin das mich jetzt ganz viele Leute aus dem Forum scheuchen mal folgende Frage.

Ich habe zwei Objekte.

Zum einen einen String welcher aus einem UDP DatagramPacket ausgelesen wird.

Das erfolgt folgendermaßen:

Code:
buffer = _packet.getData();
		length = buffer.length;
		message = new String(buffer, 0, length);

Der Inhalt dieses Strings ist "LOGIN" (ohne "").

Diesen String vergleiche ich mit einem Objekt meiner eigenen Query Klasse. Darin wird das Objekt folgendermaßen initialisiert.

Code:
public static String LOGIN   = "LOGIN";

Die Abfrage sieht folgendermaßen aus:

Code:
if (Query.LOGIN.equalsIgnoreCase(message));
{ usw. usw. }

Das Problem ist, das selbst wenn der String aus dem DatagramPacket nicht LOGIN sondern LOGOUT lautet
wird die oben genannte If-Abfrage ausgeführt. Ich habe mir beide Strings in der Konsole ausgeben lassen und bekomme für den einen folgerichtig LOGIN und für den anderen LOGOUT zurück. Trotzdem werden sie von Java als "gleich" angesehen.

Ich weiß langsam nicht mehr weiter.

Vielen Dank schonmal

Gruß

Yezariael
 

Yezariael

Mitglied
Oh... :roll: :roll:

Schande über mich. Da sitzt man davor und grübelt und grübelt und sieht den kleinsten Fehler nicht.

Vielen vielen Dank.

Besten Gruß

Yezariael

EDIT :

Okay jetzt sind wir wohl beim eigentlichen Problem angekommen.
Jetzt wird die Abfrage garnicht mehr getriggered. Ergo. Die beiden Strings werden, obwohl laut Konsole und von der Logik her vollkommen identisch, nicht als equals angesehen.

Was mich weiter irritiert. Ich nutze eine aktuelle Eclipse Version und wenn ich die beiden in der Konsole ausgeben werden von Eclipse unterschiedliche Schriftarten verwendet...Sollte mir das etwas sagen?

Danke und Gruß
 

ARadauer

Top Contributor
bzw lass dir mal die werte der einzelnen chars ausgeben..

Code:
      String test = "test";      
      for(int i = 0; i <test.length(); i++){
         System.out.println((int)test.charAt(i));
      }
da ist sicher wo was drin, was du nicht siehst...
 

Yezariael

Mitglied
Schau mal nach Whitespaces...

Whitespaces sind keine drin. Das hab ich schon 3x gegen gechecked ^^

Screenshot sieht folgendermaßen aus:

screenshot.JPG
 

Yezariael

Mitglied
bzw lass dir mal die werte der einzelnen chars ausgeben..

da ist sicher wo was drin, was du nicht siehst...

Hmm Okay
da kommt wirklich was seltsames bei rum.

Das ist der aus dem Query.LOGIN Objekt entnommene String
76
79
71
73
78
0
0
0
0
--- > ab hier könnt ihr euch noch um die 100-200 Nullen denken

Ende des Tests für DatagramPacket String

76
79
71
73
78
Ende des Tests für Query.LOGIN Objekt

Ergo. Das Datagram wird richtig ausgelesen.

Das Query Objekt erzeugt einen Haufen Müll.

Ich kanns mir nur einfach nicht erklären.
Das Objekt wird wie oben schonmal gesagt so initialisiert:

Code:
public class Query
{
public static String LOGIN   = "LOGIN";
[....] }

und dann über Query.LOGIN aufgerufen.
Woher also die ganzen nullen?

Prinzipiell sollten Sie identisch sein, da das DatagramPacket auch seinen Inhalt aus dem Query Objekt bezieht.
Nämlich über

Code:
buffer = Query.LOGIN.getBytes();
		length = buffer.length;
		
		packet = new DatagramPacket(buffer, length, address, requestPort);

Das wird dann verschickt und auf der anderen Seite wieder ausgepackt. Und dabei kommt ja, oben gesehen, Char-technisch was vernünftiges raus.
 

The_S

Top Contributor
Wenn du keine Whitespaces hast und die beiden Strings ansonsten komplett identisch sind, hast du nen sehr merkwürdigen Fehler :p ...
 

The_S

Top Contributor
Sicher, dass die Ausgabe mit den vielen 0en nicht doch das vom Datagramm ist? Das wär zumindest erklärbarer ;)
 

Yezariael

Mitglied
Sicher, dass die Ausgabe mit den vielen 0en nicht doch das vom Datagramm ist? Das wär zumindest erklärbarer icon_wink.gif

Stimmt. steht ja oben in der Auswertung auch so.
Ich komm schon ganz durcheinander :autsch:

Erklären kann (ich zumindest) es mir leider doch nicht.

Vielleicht habt ihr ja noch eine Idee wo die ganzen Nullen herkommen und was man dagegen tun kann.

Danke schonmal für die viele Hilfe, ich verzweifel langsam
 

The_S

Top Contributor
Dann poste doch mal (ohne durcheinander zu kommen) genau wie du die Daten versendest und wie du sie versendest. Und welcher Wert der String unmittelbar vor, und welchen Wert unmittelbar nach dem versenden hat.
 

Yezariael

Mitglied
Ganzen aufbereiteten Code wieder rausgelöscht:

Okay, ich glaube ich habe den Fehler gefunden.

Zum Empfang von Paketen initialisere ich ein DatagramPacket folgendermaßen:

Code:
byte[] ReadBuffer;
ReadBuffer = new byte[500];
ReadPacket = new DatagramPacket(ReadBuffer, ReadBuffer.length);

Daher die fixe Größe von 500.

Wenn ich eine empfangene Nachricht dann in einen String verpacke...

Code:
buffer = _packet.getData();
length = buffer.length;
message = new String(buffer, 0, length);

und dann folgendes auslese:

System.out.println(message.length());

Bekomme ich als Ausgabe : 500.

Gefahr erkannt, Gefahr gebannt?

Wie kann ich das denn anderweitig lösen?

Ziel ist es den Nachrichten eine maximale Länge von 500 bytes aufzuzwingen.
Wie schaffe ich es das er mir dennoch die Strings nicht endlos auffüllt?
 
T

tuxedo

Gast
>> Wie kann ich das denn anderweitig lösen?

In das Paket VOR dem String reinschreiben, wie lang der String ist .. Kannst du z.B. sicher sein, dass der String nie >256 Zeichen lang ist, kannst du das erste Byte des Paketes hierfür missbrauchen. Ansonsten halt ein short (2byte) oder integer (4byte) nehmen.

- Alex
 

Yezariael

Mitglied
In das Paket VOR dem String reinschreiben, wie lang der String ist .. Kannst du z.B. sicher sein, dass der String nie >256 Zeichen lang ist, kannst du das erste Byte des Paketes hierfür missbrauchen. Ansonsten halt ein short (2byte) oder integer (4byte) nehmen.

Hey,

könntest du mir das vielleicht ein klein wenig erklären?

Das Problem ist, zum einen weiß ich nicht im vorraus wie lang der String sein wird.
Zum anderen _muss_ ich vorher das byte Array mit irgendeiner Größe initialisieren um überhaupt ein datagramPacket empfangen zu können.

Stecke also gewissermaßen in einer Zwickmühle.

Danke und Gruß

Yezariael
 
T

tuxedo

Gast
Na in dem moment wo du den String in das Paket reinsteckst weißt du doch wie lang er ist?!

Code:
int length = myString.lenght();

Dann machst du aus dem String bytes:

Code:
bytes[] myStringAsBytes = myString.getBytes();

Und dann kommt das ganze in das Paket:

Code:
byte[] dataPacket = new byte[500];
dataPacket [0] = (byte) ((length >>> 24) & 0xFF);
dataPacket [1] = (byte) ((length >>> 16) & 0xFF);
dataPacket [2] = (byte) ((length >>> 08) & 0xFF);
dataPacket [3] = (byte) ((length >>> 00) & 0xFF);
System.arrayCopy(myStringAsBytes, 0, dataPacket, 4, length);

Fertig.

Rückwärts machst du das mit dem Integer dann in der anderen Richtung:

Code:
int ch1 = dataPacket[0];
int ch2 = dataPacket[1];
int ch3 = dataPacket[2];
int ch4 = dataPacket[3];
int length = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
byte[] stringAsBytes = new byte[length];
System.arrayCopy(dataPacket, 4, stringAsBytes, 0, length);
String myString = new String(stringAsBytes);

Fertig..

Natürlich sollte man auch noch das entsprechende Encoding des Strings beachten.. Aber die geposteten Codezeilen sollten dich jedenfalls mal weiter bringen.

btw: Schau doch mal in den Source von DataInputStream und DataOutputStream... Da kannst du abgucken wie man aus primitiven Datentypen bytes macht und umgekehrt.

- Alex
 

Yezariael

Mitglied
Na in dem moment wo du den String in das Paket reinsteckst weißt du doch wie lang er ist?!

Ja das schon.
Aber die Grundproblematik sieht anders aus.

Beim Sender wird der String in ein DatagramPacket gesteckt. Das ist richtig.

Das erfolgt über

Code:
byteArray = String xy.getBytes();

und die länge wird über
Code:
byteArray.length();
ermittelt.

Das Problem das ich habe ist, das ich auf Empfänger Seite dem ByteArray
des DatagramPackets eine Größe geben muss um überhaupt in der Lage zu sein ein Paket zu empfangen.

Und _bevor_ ich das Paket auf der Empfänger Seite empfange weiß die Empfänger Seite leider auch nicht
wie lang der String ist.



Das ist die Zwickmühle die ich meinte.

Daher ist die eigentliche Problemstellung, wie ich es schaffe aus einem "zu großen" Byte Array nur den eigentlich darin
enthaltenen String auszulesen um diesen dann mit einem anderen zu vergleichen.

Gruß

Yezariael
 
T

tuxedo

Gast
Na wenn du beim Senden das Array mit der größe 500 erstellst, solltest du auch beim Empfangen mit 500 arbeiten ...

Wenn die zu versendenden Daten eben über 500 byte groß sind, musst du dir ein Protokoll einfallen lassen, dass die Daten in max 500 byte große Pakete zerteilt. Und der empfänger muss dann gemäß Protokoll die Pakete wieder zusammensetzen.

Dass DAS nicht trivial ist, sieht man ganz gut an den Streaming-Protokollen welche auf UDP basieren ...

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Oneixee5 Oracle, wieder mal ... Allgemeine Java-Themen 12
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
V Scheinbar zufällig hin und wieder: Can't create an ImageOutputStream! Allgemeine Java-Themen 8
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
F JLabel nach 5 Sekunden wieder leeren Allgemeine Java-Themen 7
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
S Zahlen aus (String mit zahlen) immer wieder neu auslesen Allgemeine Java-Themen 5
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
M CapsLock abfragen wenn Fenster wieder aktiviert wird Allgemeine Java-Themen 5
B Mal wieder "Could not find the main class" Allgemeine Java-Themen 3
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
S Strings gehen "kaputt" wenn ich in CVS ein und wieder auschecke. Allgemeine Java-Themen 2
F Wieder mal die eBay API Allgemeine Java-Themen 3
E Speicherverwaltung bzw. Speicher wieder frei geben?! Allgemeine Java-Themen 8
T JConsole: Klassen werden geladen aber nicht wieder entladen Allgemeine Java-Themen 3
S Thread vorübergehend stilllegen und wieder aufwecken Allgemeine Java-Themen 18
data89 A-Stern: fährt immer wieder vor die Wand! - Hilfeeee Allgemeine Java-Themen 7
L Thread kurz unterbrechen und wieder starten Allgemeine Java-Themen 5
L Applet immer wieder neu laden - Problem Allgemeine Java-Themen 25
T RegEx, wieder einmal ... :-( Allgemeine Java-Themen 19
S Wieso stehen in der API immer wieder abstrakte Methoden ? Allgemeine Java-Themen 7
C Aus XML ein DOM Objekt und wieder zurück Allgemeine Java-Themen 2
M wieder mal applet probleme Allgemeine Java-Themen 17
A HTML-Seite wieder schließen Allgemeine Java-Themen 2
W Wieder einmal: PNG ausdrucken Allgemeine Java-Themen 3
S GUI komplett schließen und wieder Neu laden? Allgemeine Java-Themen 4
C Bild in .txt speichern und wieder als Bild speichern Allgemeine Java-Themen 2
A String in umgekehrter reihenfolgen wieder geben Allgemeine Java-Themen 16
GilbertGrape mal wieder ne Regex-Frage Allgemeine Java-Themen 2
A Javakonsolenfenster geht gleich wieder zu Allgemeine Java-Themen 6
G Schon wieder Regex Problem :-/ Allgemeine Java-Themen 6
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
L Werte in externer Datei speichern und wieder auslesen? Allgemeine Java-Themen 8
M Programm schließen und wieder neu starten Allgemeine Java-Themen 9
E Wieder mal der Classloader Allgemeine Java-Themen 6
J Nicht schießen - schon wieder OpenOffice. Allgemeine Java-Themen 4
R Immer wieder NullPointerException Allgemeine Java-Themen 2
L JVM: Speicher wieder für OS freigeben? Allgemeine Java-Themen 5
I Aus Exception wieder zurück Allgemeine Java-Themen 5
J Thread beenden und wieder starten? Allgemeine Java-Themen 20
M Array in eine Datei Schreiben und wieder auslesen Allgemeine Java-Themen 10
S Job immer wieder ausführen Allgemeine Java-Themen 4
N Mal wieder char-encoding Probleme Allgemeine Java-Themen 5
P Filechooser öffnet sich immer wieder neu Allgemeine Java-Themen 4
L Speicherplatz eies RIESEN objektes direkt wieder freigeben Allgemeine Java-Themen 5
V Irgendwie benutzt er wieder Java 1.4 Allgemeine Java-Themen 7
G Array/String aus Request wieder in Array konvertieren Allgemeine Java-Themen 2
A gemaltes wieder löschen Allgemeine Java-Themen 24
U Mal wieder DoubleBuffering Allgemeine Java-Themen 20
A Thema JAR-Erstellung (mal wieder) => etwas komplizierter Allgemeine Java-Themen 8
L schon wieder der "javac nicht gefunden" fehler Allgemeine Java-Themen 9
T Objekte eindeutig zerlegen und wieder zusammen bauen? Allgemeine Java-Themen 6
B mal wieder jar! Allgemeine Java-Themen 53
M schon wieder Comport-Problem Allgemeine Java-Themen 21
S JPanel zur Laufzeit verbergen bzw. wieder anzeigen lassen Allgemeine Java-Themen 4
C Über C/C++ (JNI) angeforderten Speicher wieder frei geben Allgemeine Java-Themen 3
M statische regex und vergleiche oder immer wieder compilen Allgemeine Java-Themen 2
R Aus InputStream wieder eine Datei erzeugen? Allgemeine Java-Themen 2
U schon wieder regex Allgemeine Java-Themen 3
M Mal wieder . Regular Expressions Allgemeine Java-Themen 2
J Mal wieder jars Allgemeine Java-Themen 2
T CMD nach aufruf von javaw Programmname wieder schließen Allgemeine Java-Themen 3
J String mit GZIPInputStream in Datei schreiben und wieder les Allgemeine Java-Themen 2
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
D Bilder einlesen, bearbeiten und wieder in Datei schreiben Allgemeine Java-Themen 3
G Adressen in Datei speichern und wieder auslesen Allgemeine Java-Themen 3
Ü Arrays vergleichen Allgemeine Java-Themen 59
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
D Zwei Listen vergleichen Allgemeine Java-Themen 7
F 2 JsonArray vergleichen, geht es auch einfacher ? Allgemeine Java-Themen 3
N String vergleichen. Allgemeine Java-Themen 27
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
D Erste Schritte Arrays vergleichen und die zahlen die nur einmal vorkommen ausgeben Allgemeine Java-Themen 5
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
CptK Input/Output Buttonwerte vergleichen Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
Meeresgott Best Practice Strings auf Inhalte vergleichen Allgemeine Java-Themen 1
N DNA Strings vergleichen Allgemeine Java-Themen 1
C Input/Output Textdateien vergleichen Allgemeine Java-Themen 3
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
KeVoZ_ JSoup - Website Inhalt/Element mit String vergleichen Allgemeine Java-Themen 2
K Eingabe mit Char vergleichen klappt nicht! Allgemeine Java-Themen 2
AssELAss Best Practice Checksumme über jede Spalte zweier Tabellen und vergleichen Allgemeine Java-Themen 3
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
W Variablen Dates vergleichen Allgemeine Java-Themen 7
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
J Farben mit comparing vergleichen Allgemeine Java-Themen 3
Dechasa Java 8 - Datum vergleichen Allgemeine Java-Themen 5
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben