reguläre ausdrücke auf binärdateien anwenden
-
Hi,
wie der Titel schon sagt,
kennt ihr ne Möglichkeit/bibliothek mit der man Binärdatem mittels regexes durchsuche kann?Hintergrund ist der, dass ich ein Dateiformat habe, dass ich nicht kenne, wo aber sachen drin stehen, die ich raus parsen möchte.
Ich glaube ein muster gefunden zu haben, nach dem ich die relevanten Daten herausbeomme.
Die frage ist nur wie man das möglichst einfach rausbekommt.Das Problem mit standardfunktionen ist ja, dass die bei 0 aufhören, was in binärdateien aber ständig vorkommt.
Muser sieht in etwas so aus:
eine bestimmte Zeichenfolge (davor kann beliebig viel zeug stehen) auf die wieder beliebiges zeug kommt bis zu einem Muster 0x01 0x00 0x00 0x?? und dann der String den ich suche.HAt jemand ne idee?
MfG,Vlad
-
erst konvertieren mit sowas: http://www.perlmonks.org/?node_id=711532
oder gleich selber schreibenwhile(eingabe.get(ch)) if(isgraph(ch) or isspace(ch))//iscntrl? ausgabe<<ch; else ausgabe<<"\\0x"<<hex<<int(ch);dann müßtest du prima nach \0x1\0x0\0x0\0x0[a-z]*\0x0 und so suchen können.
-
hmm, das wär eine Idee.
Allerdings wird der reguläre ausdruck extrem schwer handlebar, da für die codierung jedes char nun 1-4 Zeichen benötigt werden.
-
vlad_tepesch schrieb:
hmm, das wär eine Idee.
Allerdings wird der reguläre ausdruck extrem schwer handlebar, da für die codierung jedes char nun 1-4 Zeichen benötigt werden.Ist ein Argument. Willst ja bei "0815" nicht einen Splitter von "\0x00815" finden.
Also dahingehend das Format aufpeppen.
Vielleicht eckige Klammern und alle nichtdruckbaren Zeichen und die eckigen Klammern werden durch zwei Klammern mit der zweistelligen Hexzahl drin ausgegeben.
[00]815
Das müßte gegen Splitter schützen.
-
vlad_tepesch schrieb:
Muser sieht in etwas so aus:
eine bestimmte Zeichenfolge (davor kann beliebig viel zeug stehen) auf die wieder beliebiges zeug kommt bis zu einem Muster 0x01 0x00 0x00 0x?? und dann der String den ich suche.Such doch einfach ohne regex nach der ersten Zeichenfolge und dann nach der 0x01 0x00 0x00 und dann hast du die Stelle die du willst. Ist glaub ich einfacher, als da jetzt ewig zu versuchen was mit regex hinzu bekommen.
-
volkard schrieb:
vlad_tepesch schrieb:
hmm, das wär eine Idee.
Allerdings wird der reguläre ausdruck extrem schwer handlebar, da für die codierung jedes char nun 1-4 Zeichen benötigt werden.Ist ein Argument. Willst ja bei "0815" nicht einen Splitter von "\0x00815" finden.
Also dahingehend das Format aufpeppen.
Vielleicht eckige Klammern und alle nichtdruckbaren Zeichen und die eckigen Klammern werden durch zwei Klammern mit der zweistelligen Hexzahl drin ausgegeben.
[00]815
Das müßte gegen Splitter schützen.Was wahrscheinlichbesser wär, wenn man einfach alles ins ascii-hex format wandelt
was ich aber eigentlich meinte war, dass man den reg-ex scanner dahingehend ändern müsste, dass ein '.' ebend nicht aufein char sondern sondern 2 char matcht und auch alle Zeichenklassen anderes sind.
warumregex schrieb:
vlad_tepesch schrieb:
Muser sieht in etwas so aus:
eine bestimmte Zeichenfolge (davor kann beliebig viel zeug stehen) auf die wieder beliebiges zeug kommt bis zu einem Muster 0x01 0x00 0x00 0x?? und dann der String den ich suche.Such doch einfach ohne regex nach der ersten Zeichenfolge und dann nach der 0x01 0x00 0x00 und dann hast du die Stelle die du willst. Ist glaub ich einfacher, als da jetzt ewig zu versuchen was mit regex hinzu bekommen.
hast wahrscheinlich recht.
hät ja sein können, jemand eine leicht zu handhabende Bibliothek kennt, die genau sowas unterstützt.
Zumal ich nicht weiß, ob mein Muster wirklich in allen fällen passt, ein regex wär dann einfacher anzupassen, anstatt die komplizierte ich-suche-bis-dahin-dann-schau-ich-danach-Statemaschine zu bauen
-
vlad_tepesch schrieb:
Was wahrscheinlichbesser wär, wenn man einfach alles ins ascii-hex format wandelt
stimmt.
vlad_tepesch schrieb:
was ich aber eigentlich meinte war, dass man den reg-ex scanner dahingehend ändern müsste, dass ein '.' ebend nicht aufein char sondern sondern 2 char matcht und auch alle Zeichenklassen anderes sind.
stimmt.
mit "alles hex" kannste aber wieder statt
ha.*lo\0x0
ein
6861(..)*6c6f00
machen.ist auch mit http://www.torsten-horn.de/techdocs/ascii.htm recht schnell getippt.
oder du baust dir eine funktion, die sogar die suchstrings aufbereitet.
aus "ha.*lo\0\1" kann man ja den string "6861(..)*6c6f0001" berechnen. vielleicht so: erst das char-array in ein int-array kopieren, um spezialzeichen zu haben, beim umkopieren und dabei sachen wie "\" und "/(" unescapen, dafür aber "(" und "*" zu spezialints ab 256 machen. dann das int-array zurück in ein char-array kopieren und dabei aus "."(=256,sonderzeichen) ein "(..)" und aus jedem int unter 256 die beiden hexziffern machen.und natürlich nicht
cr=convertRegexpToCoolRegexp("ha.*lo\0\1");mit nur
string convertRegexpToCoolRegexp(string r);und damit bei \0 aus versehen abschneiden, sondern mit auch
template<size_t size> string convertRegexpToCoolRegexp(char (&r)[size]){ string sr; copy(r,r+size,back_inserter(sr)); return convertRegexpToCoolRegexp(sr); }(alle codebeispiele sind so nicht ernst gemeint, sondern erläutern nur meine wirren gedankengänge.)
-
vlad_tepesch schrieb:
Zumal ich nicht weiß, ob mein Muster wirklich in allen fällen passt, ein regex wär dann einfacher anzupassen, anstatt die komplizierte ich-suche-bis-dahin-dann-schau-ich-danach-Statemaschine zu bauen
Außerdem schüttet mein Körper beim Gedanken an die Mit-Und-Ohne-Null-Vergleichsmethode lauter Hormone aus, die auch kommen, wenn ich mir ein Knie breche. Das werte ich als ein schlechtes Omen.
-
lol
Danke, habs jetzt auf die pragmatische art zusammengefrickelt.
Das selbst zu bauen, wär mir dann doch zu viel arbeit gewesen.