Aus einem String unbekannte zeichen filtern

Jigga

Bekanntes Mitglied
Guten Abend java forum 🙂
ich habe folgendes problem:
ich sniffe UDPpackete eines bestimmten ports und lese dessen packetdaten aus in denen unteranderem ein String steht,den ich haben möchte.
Das gesamte packet.data byte array caste ich mir mit new String(array)
und erhalte dann zb sowas:
unbenanntktz.jpg


nun will ich nur den "lesbaren" string haben,hat jemand eine idee,wie ich an diesen rankomme?


PS: im lesbaren string können zahlen und folgende sonderzeichen enthalten sein:
Code:
 (!),(?),(.)(-)(:)(_),(|),(=),(\),(/),([),(]),({),(}),(~),(&),($) und die normalen klammern selbst
 
Regex wäre eine Möglichkeit. (\p{L}[0-9][Sonderzeichen])

Aber bist du sicher, dass du nicht falsch castest? Ich mein was sind das denn für Zeichen die nicht mit UTF-8 gelesen werden können?
 
mein cast sieht eigentlich wie folgt aus:
Java:
System.out.println(new String(p.data));

habe mich das auch schon gefragt,weil das ganze in wireshark ganz anders aussieht (zum teil),oder es ersetzt die nicht unterstützten zeichen einfach mit einem "."
 
Zuletzt bearbeitet:
du könntest die character zum int casten und eine bestimmte range filtern. wäre auch gut gewesen, wenn du das zeug searchable gepostet hättest 🙂
 
du könntest die character zum int casten und eine bestimmte range filtern. wäre auch gut gewesen, wenn du das zeug searchable gepostet hättest 🙂

hätte ich ja gerne geamacht,aber ich glaube,dass ich nach einem copy-paste hier ein anderes resultat hätte 😀
zumindest ist bis jetzt jegliches copypaste fehlgeschlagen.

meine idee war es eig auch regex zu verwenden und dann alles raushauen,was nicht zu standardzeichen,buchstaben,zahlen gehört.geht das?

du meinst über das byte[] eine schleife laufen lassen und jeden index in char casten?
sowas hatte ich auch mal versucht,als ich auf der suche nach "wie mache ich die packet.data sichtbar war
dabei kam eine range von -127 bis 127 raus meine ich.hab nur keine ahnung wofür diese zaheln dann stehen



EIDT:gerade kam mir eine idee.der server von dem ich die packete erhalte steht im asiatischen raum.kann es sein,dass die kästchen für eine unbekannte schrift stehen,wie zb die chinesischen zeichen?
 
Zuletzt bearbeitet:
Es gibt bei utf-8 kaum unbekannte zeichen

ok ich verstehe,dann sind das vll keine strings,sondern zahlen oder etwas die eigenschaften des packetes beschreiben.
bezüglich deines regex ansatzes mit (\p{L}[0-9][Sonderzeichen]) :

was ist wenn der lesbare text nur buchstaben/zahlen enthält oder zB keine sonderzeichen?
wäre das dann mit dem "oder" machbar?
ich bin leider nicht so fit in regex,kann ich in "Sonderzeichen" die dinger einfacher hintereinander wegschreiben?
es ist halt schwer,weil diese enthalten seine können,aber eben nur können ???:L
 
Ist dein String jetzt eig. nur die markierte Zeile, oder alles ? Generell stelle ich es mir etwas schwer vor, da jetzt genau das raus zu filtern was du willst, denn in deiner markierten Zeile hast du z.B. eine alleinstehende 2, in paar Zeilen da drunter ein x und a usw. Was sind denn das für Pakete? Kann man da nicht evtl. immer vorne und hinten generell etwas abschneiden? Hat der String der dich interessiert evtl. eine minimale Länge? So dass man dieses x und a auch ignorieren kann usw....
 
Ist dein String jetzt eig. nur die markierte Zeile, oder alles ? Generell stelle ich es mir etwas schwer vor, da jetzt genau das raus zu filtern was du willst, denn in deiner markierten Zeile hast du z.B. eine alleinstehende 2, in paar Zeilen da drunter ein x und a usw. Was sind denn das für Pakete? Kann man da nicht evtl. immer vorne und hinten generell etwas abschneiden? Hat der String der dich interessiert evtl. eine minimale Länge? So dass man dieses x und a auch ignorieren kann usw....


jede zeile ist ein einzelner String.
und ja zwischendurch kommen da mahl vereinzelt normale buchstaben/zahlen,diese interessieren mich nicht.
der gewünschte string hat eine maximallänge von 15, und eine minimalänge von 3 zeichen(buchstaben u/o zahlen u/o sonderzeichen)
und ja an das abschneiden habe ich auch bereits gedacht,ich glaube jedoch,dass der string immer an verschiedenen stellen steht,generell kann man sagen eher in der zweiten hälfte,demnach könnte man da schon etwas wegschneiden,jedoch den geneauen schnitt zu landen wäre da schon komplizierter
 
Vllt. hilft ja sogar schon so etwas wie String(byte[] bytes, Charset charset) und dem richtigen Charset ? :bahnhof:
Mhm, ansonsten könntest du mal so etwas wie
Java:
		final int MIN_LENGTH = 3;
		final int MAX_LENGTH = 15;
		final String REGEX = ".*?([\\x21-\\x7E]{"+MIN_LENGTH+","+MAX_LENGTH+"}).*?";
		Pattern p = Pattern.compile(REGEX);
		Matcher matcher = p.matcher(s);
		while (matcher.find()) {
			System.out.println(matcher.group(1));
		}
ausprobieren, wobei s = der String/Zeile (oder aber den kompletten Paketstring) ist.
Das wäre jetzt das was nrg vorgeschlagen hat, einen bestimmten ASCII Bereich zu erlauben, hier Hex 21(33) bis Hex 7E (126) (ASCII-Tabelle) , würde also auch einige Sonderzeichen(#, %, @ ..) erlauben die von dir nicht gewünscht sind(kann man aber natürlich noch anpassen)
Oder aber man entfernt einfach alle Zeichen die diesen Zeichen nicht entsprechen (wobei man dann wieder Probleme mit den einzelnen erlaubten Zeichen hätte unter Umständen ?! )
Java:
		final String REGEX2 = "[^\\x21-\\x7E]";
		s = s.replaceAll(REGEX2, "");

:roll:

ich gehe mich jetzt mal verstecken 🙂
 
Zuletzt bearbeitet:
@eraaaa:
ich liebe dich für den code!
hat mir zwar nicht direkt geholfen,aber trotzdem! 😀
mir ist durch wireshark letztens eingefallen,dass die strings doch immer an der selben stelle stehen,also habe ich die gewünschte stelle bestimmt,den string rausgeholt und dann deinen code darauf angewandt um nur das zu holen was ich brauche,falls es drinne ist.
funktioniert jetzt super,vielen dank für die hilfe!
 

Zurück
Oben