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  contentWir 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 = 123

    Inhalt 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


Anmelden zum Antworten