Auslesen einer "text-ähnlichen" Datei...
-
Ich will eine "Textdatei" ähnliche Datei auslesen (diese wird von einem "fremden" Programm erzeugt).
Nun ist aber das Problem das da auch etwas "Textuntipysche Zeichen" enthalten, die mir mein Vorhaben etwas erschwert.Hier ein Beispielinhalt dieser Datei:
¿ ATCSO createTXT name myTXT contentWir haben ne website.
Da ich nun nicht so bewandert bin mit C, habe ich mich gefragt wie man diese Datei am besten analysiert.
Und zwar möchte ich die Strings "myTXT" (der Name einer Textdatei) und "Wir haben ne Website." (der Inhalt der Textdatei) auslesen.
Dabei sind diese 2 Strings ja immer unterschiedlich.Dagegen sind die 2 Strings "name" und "content" fest definiert und nach diesen jeweils wird immer der String aufgeführt auf den es mir ankommt, also in diesem falle "myTXT" und "Wir haben ne Website.".
Da, da jetzt aber auch noch etwas andere Zeichen enthalten sind weis ich nicht wie ich dies am besten auslese.
Mein Ziel ist es diese Informationen so schnell und einfach wie möglich zu ermitteln.
Hatte bisher immer ne while-Schleife die bis EOF den Inhalt Buchstabe für Buchstabe eingelesen hat.
Nun hatte ich mir gedacht das ich eventuell einen charPionter definiere, und dann durch den Inhalt gehe bis ich auf ein "n" treffe und dann gucke ob es das Wort "name" ist.
Aber mich stören einfach diese "merkwürdigen Zeichen".
Auch ist der String "myTXT " eigentlich als "myTXT" dem Programm übergeben wurden, da dies den Namen der zu erstellenden Textdatei symbolisiert muss ich schon wissen ob da die Leerzeichen hinten gewollt sind oder nicht (aber ich glaube das kann man in diesem Fall nicht mehr ermitteln).
Aber um dies zu umgehen könnte ich noch eventuell links und rechts von den Strings Zeichen anhängen die etwas untypisch sind um dann dieser Problem zu umgehen.Kann mir da jemand, aufgrund dieser etwas verwirrenden Informationen, einen Tipp geben wie ich diese Datei am besten analysiere?
(Wäre nett wenn Codebeispiele, da ich leider noch nicht also bewandert bin, eure eventuelle Erklärung unterstützen könnten.)mfg rendner
-
das letzte textfeld mit dem inhalt "Wir haben ne website." hat warscheinlich eine variable länge. da das programm, das diese datei benutzt, die daten ja wieder irgendwie einlesen können muß, wird also irgendwo die länge dieses textfeldes gespeichert sein. ich vermute mal das die ersten vier bytes (die mit dem auf den kopf gestellten fragezeichen) die gesamtlänge des datensatzes als 32-bit-int enthalten.
die kästchen sind vielleicht nul-bytes (mußt du mal mit nem hex-editor nachgucken). die würden dann das ende eines textfeldes markieren. möglich ist auch, daß das programm, das diese dateien erzeugt, einfach den speicherinhalt einer datenstruktur mit fwrite() schreibt. in diesem falle wäre alles, was nach dem nul-byte bis zum anfang des nächten textfeldes kommt, zufällig.
es kann auch sein, daß einige der textfelder immer eine feste länge haben und wenn der eingetragene text kürzer als das textfeld ist, wird mit leerzeichen aufgefüllt.
du mußt mal verschiedene dateien dieses typs miteinander vergleichen und schauen, ob die textfelder immer die gleiche länge haben oder ob die länge variiert.
du kannst ja mal, wenns nicht zu lang wird, die ausgabe eines hex-editors von mehreren dieser datensätze hier posten. dann könnte ich dir sicher genaueres sagen.
-
Habe mitlerweile auch schon weiter experimentiert.
Hatte am anfang immer die Datei normal eingelesen, als ich es dann binär probierte habe ichs auch mitbekommen das das irgendwelche "Steuerzeichen" sind.
Zwischen den Strings tauchen verschieden ASCII Werte auf:
0 = null;
1 = start of heading;
4 = end of transmission;
5 = enquiry;
...Aber in welcher weise diese interpretiert werden konnte ich nocht nicht herausfinden.
ich vermute mal das die ersten vier bytes (die mit dem auf den kopf gestellten fragezeichen) die gesamtlänge des datensatzes als 32-bit-int enthalten.
Das kann sein, denn wenn ich noch mehr Variablen drin speichere ist das ein anderer.
(die erzeugte Datei ist so etwas wie ein cookie, man kann in dem Programm verschiedene Variablen mit deren Inhalt speichern)Hmm, nen Hexeditior besitze ich gar nicht.
Kannst du da einen empfehlen der freeware ist, und mit den auch ein Anfänger zurecht kommt?Hier mal der Inhalt der Datei der ich 3 Parameter übergeben habe:
¿ _TCSO createTXT name myTXT content Wir haben ne website. test Teststring1
Erklärung:
"createTXT" = von dem Programm selber eingefügt, ist der Name der Datei ohne extension
// name, Datentyp = String (bezieht sich auf die Datentypen des Programms)
name = "myTXT"
// content, Datentyp = String
content = "Wir haben ne website."
// test, Datentyp = String
test = "Teststring1"Dannach habe ich mal den Inhalt der Datei als ASCII ausgeben lassen:
0 191 0 0 0 95 84 67 83 79 0 4 0 0 0 0 0 9 99 114 101 97 116 101 84 88 84 0 0 0 0 0 4 110 97 109 101 2 0 5 109 121 84 88 84 0 0 7 99 111 110 116 101 110 116 2 0 21 87 105 114 32 104 97 98 101 110 32 110 101 32 119 101 98 115 105 116 101 46 0 0 4 116 101 115 116 2 0 11 84 101 115 116 115 116 114 105 110 103 49 0
Die Umbrüche sind jetzt von mir zur besseren lesbarkeit eingefügt.
Vielleicht kannste ja daraus schon etwas sehen, werd gleich noch einmal eine Datei erzeugen mit weniger Inhalt und mir dann mal nen Hexeditor besorgen.Übrigens Danke schon mal das du mir hilfst, für mich ist das etwas zu hoch, da ich so etwas auch noch nie gemacht habe.
mfg rendner
-
So habe hier mal 2 "kurze" Beispiel zusammen gestellt:
Beispiel 1)
Werte die von dem Programm gespeichert wurden:
// name, String
name = "myTXT"Inhalt der Datei:
¿ (TCSO createTXT name myTXT
ASCII-Werte:
0 191 0 0 0 40 84 67 83 79 0 4 0 0 0 0 0 9 99 114 101 97 116 101 84 88 84 0 0 0 0 0 4 110 97 109 101 2 0 5 109 121 84 88 84 0
(Umbruch selber eingefügt.)
Hexeditor:
0x00 00BF 0000 0028 5443 534F 0004 0000 0000 0x10 0009 6372 6561 7465 5458 5400 0000 0000 0x20 046E 616D 6502 0005 6D79 5758 5400
Beispiel 2)
Werte die von dem Programm gespeichert wurden:
// number, Number
number = 123Inhalt der Datei:
¿ +TCSO createTXT number @^À
ASCII-Werte:
0 191 0 0 0 43 84 67 83 79 0 4 0 0 0 0 0 9 99 114 101 97 116 101 84 88 84 0 0 0 0 0 6 110 117 109 98 101 114 0 64 94 192 0 0 0 0 0 0
Hexeditor:
0x00 00BF 0000 002B 5443 534F 0004 0000 0000 0x10 0009 6372 6561 7465 5458 5400 0000 0000 0x20 066E 756D 6265 7200 405E C000 0000 0000 0x30 00
mfg rendner
-
Beispiel 3)
Werte die von dem Programm gespeichert wurden:
// str, String
str = "hello"Inhalt der Datei:
¿ 'TCSO createTXT str hello
ASCII-Werte:
0 191 0 0 0 39 84 67 83 79 0 4 0 0 0 0 0 9 99 114 101 97 116 101 84 88 84 0 0 0 0 0 3 115 116 114 2 0 5 104 101 108 108 111 0
Hexeditor:
0x00 00BF 0000 0027 5443 534F 0004 0000 0000 0x10 0009 6372 6561 7465 5458 5400 0000 0000 0x20 0373 7472 0200 0568 656C 6C6F 00
Beispiel 4)
Werte die von dem Programm gespeichert wurden:
// str, String
str = "Mal ein etwas laengerer Text um zu sehen was passiert."Inhalt der Datei:
¿ XTCSO createTXT str 6Mal ein etwas laengerer Text um zu sehen was passiert.
(Keine Ahnung wieso da jetzt eine 6 am Anfang des Inhaltes des Strings steht, habe da extra noch mal geprüft das das kein Tippfehler meinerseits ist.
Das Programm gibt die 6 aber nicht mit aus wenn ich mir den Inhalt des Strings "str" anzeigen lasse.)ASCII-Werte:
0 191 0 0 0 88 84 67 83 79 0 4 0 0 0 0 0 9 99 114 101 97 116 101 84 88 84 0 0 0 0 0 3 115 116 114 2 0 54 77 97 108 32 101 105 110 32 101 116 119 97 115 32 108 97 101 110 103 101 114 101 114 32 84 101 120 116 32 117 109 32 122 117 32 115 101 104 101 110 32 119 97 115 32 112 97 115 115 105 101 114 116 46 0
Hexeditor:
0x00 00BF 0000 0058 5443 534F 0004 0000 0000 0x10 0009 6372 6561 7465 5458 5400 0000 0000 0x20 0373 7472 0200 364D 616C 2065 696E 2065 0x30 7477 6173 206C 6165 6E67 6572 6572 2054 0x40 6578 7420 756D 207A 7520 7365 6865 6E20 0x50 7761 7320 7061 7373 6965 7274 2E00
So hoffe du kannst da etwas raus lesen.
Nach dem ersten komischen String, der bis jetzt komischerweise immer mit "SO" endete, kommen immer 8 Bytes die gleich sind.
Dann der Name der Datei ohne Extension und dann wieder 6 Bytes die fast gleich sind (bis auf das letzte Byte davon), aber ansonsten konnte ich keine Information aus den Hexwerten lesen, vielleicht hast du ja mehr Glück.mfg rendner
-
Bin gerade dabei mich mit dem Hexeditor anzufreunden und muss sagen, dass so ein tool ganz schön praktisch ist.
Habe gerade herausgefunden das Zahlen von dem Programm im Format( Double IEEE, 64 Bit, Fliesskomma, Big Endian ) abgespeichert werden.
Da muss ich mal ein bisschen im Netz stöbern wie ich das dann mit C umwandele das ich den Wert dann auch so ausgeben kann.Konntest du schon etwas aus den geposteten Hexwerten erkennen?
Big Endian = das höchstwertige Byte an der niedrigsten Speicheradresse
( nur zur Info, aber das weist du sicherlich)
EDIT:
Mir ist aufgefallen bevor ein String kommt, erst nach dem 5 Byte String der am Anfang kommt, das die Zahl die davor steht die Anzahl der Buchstaben des Strings darstellen.
Dadurch ist dann am Anfang des langen Strings im Beispiel eine 6 vor dem eigentlichen String.EDIT 2:
Von dem 5 Byte String, ist das erste Byte die Anzahl der folgenden Bytes.Jetzt müsste man nur noch Wissen wofür dieser restliche Teil (4 Byte) steht.
Der ja eigentlich fast gar nicht mehr interessiert da er bisher immer gleich war.Bedanke mich trotzdem bei dir für den Tipp mit dem Hexeditor und für deine angebotene Hilfe.
mfg rendner