Reguläre Ausdrücke - Statements überspringen, absoluten Index jedoch beibehalten.
-
Ich lese mit Perl eine Anwendung ein und lasse mir durch einen RA sämltiche Strings rausfiltern:
#Blabla open(FH,"Anwendung.exe") $input=<FH>; close(FH); #Alle druckbaren Zeichen von ASCII und so viele wie möglich rausfiltern: while($input=~/([ -}]+)/mg) { $output.="$1\n"; } #Blabla
Klar, der Code liefert mir auch jede Menge Bullshit als Ergebnis, aber es ist notwendig, da ich es mir nicht leisten kann, eine Zeichenfolge zu verpassen, selbst wenn's nur ein Formatierungsstring ist.
Habe aber das Problem. dass ich ebenfalls die Position aka Index und Länge des Strings brauche.
$output.=index($input,$1).'|'.length($1)."|$1\n";
Mit
index
undlength
normalerweise kein Problem, aber Programme haben die Eigenheit, mehrere Strings gleichen Wertes in ein und derselben Datei zu beinhalten. Wenn der String also schon mal früher aufgetaucht ist, wird mir nur das erste Auftauchen des Strings rausgegeben, und das nützt mir nichts.Den Teilstring löschen geht nicht, weil die Position aller übrigen Strings verfälscht wird. Ich müsste also einen String mit der Länge des Strings da einfügen. Ich habe aber keine Ahnung, wie das in Perl zu bewerkstelligen ist, oder zumindest würde mir da etwas unschönes wie
split
und Verkettung mit einem Bufferstring einfallen. Irgendeine bessere Idee?
-
ich weiß nicht was du damit letztendlich erreichen willst, und ob das dabei hilft, aber wenn du jedes nicht-druckbare Zeichen durch z.b. 0x00 ersetzt? Dann bleibt dein lesbarer String gleich.
-
DerBaer schrieb:
ich weiß nicht was du damit letztendlich erreichen willst, und ob das dabei hilft, aber wenn du jedes nicht-druckbare Zeichen durch z.b. 0x00 ersetzt? Dann bleibt dein lesbarer String gleich.
So weit war ich auch schon. Das Problem: wie kann ich in dem RA angeben, dass er einen String von der Länge des zu ersetzenden Strings mit 0en generiert und ihn ersetzt?
-
Glühbirne schrieb:
Den Teilstring löschen geht nicht, weil die Position aller übrigen Strings verfälscht wird.
Führ ne Variable ein, die mitzählt, wie viele Zeichen bereits gelöscht wurden.
-
Michael E. schrieb:
Führ ne Variable ein, die mitzählt, wie viele Zeichen bereits gelöscht wurden.
Blödmann, Blödmann, Blödmann. Ich komm mit dieser Sprache nicht zurecht ...
Danke. Danke, dass du mich auf das offensichtlichste aufmerksam gemacht hast.
-
ungefähr so:
$input =~ s/[^ -}]/\000/g;
oder:
$leerstring = "\000" x length($1);
-
DerBaer schrieb:
...
Dummerweise würde ich bei der ersten Variante keine Länge haben, und in der zweiten Variante müsste ich erst alles spliten und neu einfügen. Das bringt mich nicht weiter.
Zudem ich auch ein anderes Problem habe. Mein Hex-Editor zeigt mir für meine Datei zum Beispiel 1000 Bytes an, mein Programm aber gut 32 Bytes weniger. Ich kann nur vermuten, dass beim Einladen Daten verloren geht, oder?
#Datei einlesen. open(FH,'Anwendung.exe'); $input=join('',<FH>); close(FH): #Länge ausgeben. Sind aber 32 Bytes zu wenig. $length=length($input); print "$lenght\n";
Noch eine kurze Bemerkung: ich versuche, eine Win32-Exe zu öffnen, bedeutet das irgendwas?
-
Glühbirne schrieb:
Zudem ich auch ein anderes Problem habe. Mein Hex-Editor zeigt mir für meine Datei zum Beispiel 1000 Bytes an, mein Programm aber gut 32 Bytes weniger. Ich kann nur vermuten, dass beim Einladen Daten verloren geht, oder?
Textmodus vs. Binär, dran gedacht? Da du eine .exe aufmachen willst, bist du wohl unter Windows unterwegs, da macht das einen Unterschied.
#Länge ausgeben. Sind aber 32 Bytes zu wenig. $length=length($input); print "$lenght\n";
lenght != length
-
Bashar schrieb:
Textmodus vs. Binär, dran gedacht? Da du eine .exe aufmachen willst, bist du wohl unter Windows unterwegs, da macht das einen Unterschied.
Nein, aber wie ich bereits angedeutet hatte, bin ich noch nicht so weit. Danke für den Denkanstoß.