Daten zwischen Bytefolgen extrahieren
-
Hallo,
ich bin neu hier und freue mich auf zahlreiche anregende Diskussionen.
Als Elektrotechnikingenieur bin ich vertraut mit der Signalverarbeitung per Hardware, aber in der Software fehlt mir die Erfahrung (naja..alles mal gelernt, aber dann nie wieder gebraucht).
Zu meinem Problem:
Ich habe eine Datei, die im hex-Editor betrachtet so aussehen könnte:
1F 8B 08 08 AA AA AA AA AA AA AA AA AA AA AA AA AA AA 00 1F 8B 08 08 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 00 1F 8B 08 08 00 00 00 00 00 00 beliebig fortsetzbar
Man kann die sich wiederholende Bytefolge 1F 8B 08 08 erkennen.
Wie sähe der essentielle Teil eines C-Programms aus, das die Daten zwischen zweier derartiger Bytefolgen in neue Dateien schreibt und die Bytefolge als Beginn der Datei beibehält? Anzumerken wäre noch, dass der entsprechende Datenstrom stets mit 00 endet. Das Ergebnis zu meinem oben angeführtem Beispiel würde demnach so aussehen:
Datei 1: 1F 8B 08 08 AA AA AA AA AA AA AA AA AA AA AA AA AA AA 00 Datei 2: 1F 8B 08 08 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 00 Datei 3: 1F 8B 08 08 00 00 00 00 00 00
Dabei ist es nicht von Relevanz, welchen Namen die neuen Dateien erhalten. Der Information halber, wie viele einzelne neue Dateien "extrahiert" wurden, könnte aber der Dateiname z. B. eine fortlaufende Zahl sein:
00000001.dat, 00000002.dat, ..., 99999999.dat
Wie sähe ein möglicher Lösungsansatz aus?
Vielen Dank und Gruß
-
Die Bytefolgen, die in beiden Dateien vorkommen: wo kommt die her? Ist sie Teil der Eingabe oder muss das Programm diese Bytefolgen selber erkennen? Und wenn ja, wie viele Bytefolgen müssen erkannt weren? Alle? Auch Bytefolgen, die nicht am Anfang der Datei stehen sondern erst später auftauchen? In dienem Bsp fangen alle Dateien mit 1F 8B 08 08 an. Was wäre wenn weder Datei 1 noch Datei 2 usw. mit dieser Folge anfägt? Müsste man auch nach 1F 8B 08 08 scannen?
-
Danke für Deine Antwort.
Ich habe eine einzige Datei vorliegen. In dieser Datei wiederholt sich die genannte Bytefolge (1F 8B 08 08) permanent, dazwischen befinden sich beliebige Daten.
Die Daten, die zwischen genau dieser Bytefolge liegen, sollen in neue Dateien geschrieben werden.
In meinem Beispiel sind Datei 1, Datei 2 und Datei 3 die aus der ursprünglichen Datei (die 3 mal das 1F 8B 08 08 enthält) extrahierten Daten.
Man kann die Bytefolge quasi als Trennzeichen zwischen den zu extrahierenden Blöcken ansehen, die Kombination ist statisch (muss also dem Programm nicht extra übermittelt werden, es handelt sich immer im diese eine Kombination, das Programm muss keine Bytefolge selbst erkennen). Die Wahrscheinlichkeit auch in den "Nutzdaten" die Kombination zu finden, ist vernachlässigbar.Um es mal bildlich auszudrücken:
Öffne die angegebene Datei.
Suche ab Anfang nach 1F 8B 08 08. (Anmerkung: die Datei beginnt schon mit dieser Bytekombination).
Schreibe die der Bytekombination folgenden Daten in eine neue Datei, schließe die Datei, wenn Du wieder 1F 8B 08 08 findest, bzw. fange an dieser Stelle eine neue Datei an.Die neuen Dateien sollen dabei auch mit 1F 8B 08 08 beginnen.
Ich führe nochmal mein Beispiel an:
Ursprung:
1F 8B 08 08 AA AA AA AA AA AA AA AA AA AA AA AA AA AA 00 1F 8B 08 08 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 00 1F 8B 08 08 00 00 00 00 00 00
aufgetrennte Datei:
1F 8B 08 08 AA AA AA AA AA AA AA AA AA AA AA AA AA AA 00 |
1F 8B 08 08 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 00 |
1F 8B 08 08 00 00 00 00 00 00Resultat:
neue Datei 1:
1F 8B 08 08 AA AA AA AA AA AA AA AA AA AA AA AA AA AA 00neue Datei 2:
1F 8B 08 08 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 00neue Datei 3:
1F 8B 08 08 00 00 00 00 00 00Ich hoffe, mein Anliegen ist jetzt deutlicher beschrieben.
-
hier mal 'n kleines beispiel, das die bytefolge 1,2,3 im speicher sucht und falls gefunden, die beiden bytes danach ausgibt. es wird so lange im source-array gesucht, bis nichts mehr gefunden wird. wahrscheinlich nicht ganz fehlerfrei, aber vielleichts hilfts dir:
char *find (char *what, int whatlen, char* src, int srclen) { char idx = 0; char *max = src + srclen; for (;src<max;) { if (what[idx] == *src) { idx++; if (idx == whatlen) return src+1; } else if (idx != 0) { idx = 0; continue; } src++; } return 0; } int main () { char test[] = {0,1,1,2,1,2,3,4,5,6,1,2,9,8,1,2,3,100,101,6,2,1,2,3,1,2}; char what[] = {1,2,3}; char *f = test; for (;;) { int len = sizeof(test) - (f-test); f = find (what, sizeof(what), f, len); if (!f) break; printf ("%d %d\n", f[0], f[1]); } return 0; }