C / Hex-Dump programmieren.



  • SeppJ schrieb:

    Andromeda schrieb:

    fichtl schrieb:

    Ist dies so akzeptabel ? UND jetzt noch die frage
    mein Programm funktioniert einwandfrei soweit und auch wird alles korrekt angezeigt ...

    Passt doch, Alter. C ist eine Sprache für Praktiker. Wenn dein Code funzt und auch an den (definierten) Rändern keine Anomalien aufweist, dann ist alles gut. 🙂

    Du sagst "Praktiker", du beschreibst "Stümper".

    Nope, nicht umsonst sprach ich von "definierten Rändern". Wenn der Code in einem bestimmten Bereich tut, was er tun soll, dann ist er gut und richtig. The Sprit of C, Alter. C++-ler kapieren das nicht. Ist aber egal. 🙂


  • Mod

    Andromeda schrieb:

    Nope, nicht umsonst sprach ich von "definierten Rändern". Wenn der Code in einem bestimmten Bereich tut, was er tun soll, dann ist er gut und richtig. The Sprit of C, Alter. C++-ler kapieren das nicht. Ist aber egal. 🙂

    Aha, zum Beispiel, dass es ok ist einen Pufferüberlauf zu haben, so lange es funktioniert? Klar!

    Bist du eigentlich so eine Art Internet Agent Provocateur? Erst lässt du alle Nicht-Nazis in NadrW dumm aussehen, alleine weil sie dich auf ihrer Seite haben und daher mit deinem dummen Gehabe assoziiert werden; und nun alle C-Programmierer (zu denen übrigens auch ich zähle, aber das jemand auch mehrere Dinge sein kann ist ja absolut unvorstellbar für dich und dein primitives Schubladendenken).



  • SeppJ schrieb:

    Aha, zum Beispiel, dass es ok ist einen Pufferüberlauf zu haben, so lange es funktioniert? Klar!

    Genau das. Habe ich tatsächlich schon erlebt. Der Einfachheit halber wurde stumpf weitergezählt, in einem schwachbrüstigen System, das per Bit-Banging mit der Außenwelt kommunizierte, um Taktzyklen zu sparen. Dem braven C++-Coder würden die Haare zu Berge stehen.

    SeppJ schrieb:

    Bist du eigentlich so eine Art Internet Agent Provocateur? Erst lässt du alle Nicht-Nazis in NadrW dumm aussehen, alleine weil sie dich auf ihrer Seite haben und daher mit deinem dummen Gehabe assoziiert werden; und nun alle C-Programmierer (zu denen übrigens auch ich zähle, aber das jemand auch mehrere Dinge sein kann ist ja absolut unvorstellbar für dich und dein primitives Schubladendenken).

    Ich kenne halt den ganzen Scheiß aus der Praxis. Das trifft auch auf die Nazis aus NadrW zu. Schmeiß mich doch raus, wenn du mich nicht ertragen kannst. Das ist mir sowas von egal. 🙂



  • Andromeda schrieb:

    Genau das. Habe ich tatsächlich schon erlebt. Der Einfachheit halber wurde stumpf weitergezählt, in einem schwachbrüstigen System, das per Bit-Banging mit der Außenwelt kommunizierte, um Taktzyklen zu sparen.

    Auf Assembler-Ebene ist das vielleicht OK - also da, wo die Maschine die Regeln vorgibt.
    Bei C und C++, wo ein Standard vorgibt, was erlaubt und was UB ist, kann aus dem ganzen Programm schnell kompletter Unsinn werden. Selbst wenn das Verhalten für die Zielmaschine definiert ist - der Standard sagt was anderes, und nach dem richtet sich der Compiler, oder sollte sich richten.

    Andromeda schrieb:

    Schmeiß mich doch raus, wenn du mich nicht ertragen kannst. Das ist mir sowas von egal. 🙂

    Da, wo ich herkomme, heißt es kürzer: "Do it, faggot!"

    Und ich täte. Oh, und wie ich täte.



  • genial ich danke sehr.

    also printf("... wurde schon mal durch fputc() ersetzt und mit:

    #include <ctype.h>
    

    hab ich jetzt isgraph() entdeckt und es funktioniert auch immer noch super.

    AHHH ja !!

    char buffer[16];
    
    *i += 1;
    
            if(*i == 16)
            {
                printf("  ->   ");
                for(int c = 0; c < 16; c++)
                {
                    fputc(buffer[c], stdout);
                }
                puts("");
                *i = 0;
            }
    

    😃

    Genial die hilfe hier, ihr habt grossen Dank. 🙂



  • printf("  ->   ");
    for(int c = 0; c < 16; c++)
    {
        fputc(buffer[c], stdout);
    }
    puts("");
    i = 0;
    

    Warum nicht:

    printf("  ->   %16s\n",buffer);
    

    ?



  • joooo genau, das war auch mein ursprünglicher plan, aber aus dem denkfehler, bastelte ich diesen Müll.

    Was soll ich sagen, man lernt nie aus. 😉

    Vielen dank nochmals.

    und ein schönes wochenende.

    Tante edit meint:

    ich wusste es es geht nicht ohne '\0' wenn ich es wieder als string ausgeben will 😉

    if(*i == 16)
            {
                buffer[*i] = '\0';
                printf("  ->   %s\n", buffer);
                *i = 0;
            }
    

    und es läuft wie geschmiert. 🙂

    Jetzt eben noch die frage:
    Bei meinem Programm, zeigt es den dump einer file z.b. 0AF3 und wenn ich die selber file mit hexdump bearbeit F30A an. Aber der Text neben an ist korrekt, also kein vertauschen oder ähnliches.



  • fichtl schrieb:

    ich wusste es es geht nicht ohne '\0' wenn ich es wieder als string ausgeben will

    Zeichensetzung würde deinen Sätzen verdammt gut tun.

    fichtl schrieb:

    und es läuft wie geschmiert.

    Vorrausgesetzt, dass immer noch char buffer[16] gilt: nein, tut es nicht. Damit bist du genau wieder beim Problem der letzten Seite: 16 Elemente im Array, und mit Index 16 greifst du auf das 17. Element zu. UB, yadayada.

    printf muss eh dein Array durchgehen, um jeden Buchstaben in die Ausgabe zu schreiben. Oder ConsoleWrite / write / wie immer der Syscall am ende heißt. Da kannst du dir das Setzen von NUL an sich auch sparen und direkt die Länge verwenden; ich behaupte, dass es kaum nachprüfbare Performanceeinbußen hat (und "nachprüfbar" ist noch mal eine ganze Ecke kleiner als "spürbar"). Also lass es doch auf 16 Zeichen und verwende "%16s" .

    fichtl schrieb:

    Bei meinem Programm, zeigt es den dump einer file z.b. 0AF3 und wenn ich die selber file mit hexdump bearbeit F30A an. Aber der Text neben an ist korrekt, also kein vertauschen oder ähnliches.

    Hexdumb interpretiert die Daten an dieser Stelle vermutlich als uint16_t , und du bist vermutlich auf einer Little-Endian Maschine. Sind meines Wissens alle x86 und x64. Deswegen sind die Werte vertauscht.

    Du allerdings holst dir die Werte Byteweise. Da wird nichts vertauscht.



  • dachschaden schrieb:

    Andromeda schrieb:

    Genau das. Habe ich tatsächlich schon erlebt. Der Einfachheit halber wurde stumpf weitergezählt, in einem schwachbrüstigen System, das per Bit-Banging mit der Außenwelt kommunizierte, um Taktzyklen zu sparen.

    Auf Assembler-Ebene ist das vielleicht OK - also da, wo die Maschine die Regeln vorgibt.

    Im Prinzip ist C eine generalisierte Assemblersprache. Du kannst oder musst mit vielen maschinennahen Elementen wie Registern, Speicheradressen, Bitbreiten usw. hantieren. Du kannst portables C coden, wie auch solches, das nur auf deinem Prozessor läuft. Die Flexibilität von C ist unschlagbar.

    Das ist vermutlich eine wesentliche Eigenschaft dieser Sprache, die sie viele Jahrzehnte nach ihrer Entstehung immer noch zu den am meisten genutzten Programmiersprachen macht. Solange es Computer gibt, die sich nach Flynn klassifizieren lassen, wird der Siegeszug von C ungebrochen sein. 🙂



  • Andromeda schrieb:

    Im Prinzip ist C eine generalisierte Assemblersprache.

    Nicht, wo dir der Standard sagt, dass es UB ist. Wenn dir das nicht gefällt, musst du die entsprechenden Module/Funktionen in Assembler programmieren. Sonst kann es irgendwann krachen, und du bist dafür verantwortlich. So einfach.



  • Guten Morgen.

    Ja das mit den Satzzeichen, dafür entschuldige ich mich.

    Also, ja , das mit dem '\0' führte wieder zum gleichen Problem, aber:

    printf("  ->   %16s\n", buffer);
    

    Gab dann so eine ausgabe:

    68 61 6C 6C 6F 0A 6B 65 72 7A 65 20 72 75 6C 65   ->   hallo.kerze.herr�q&�e
    

    Eig. sollte bei herr dann fertig sein.

    Grüsse Euch



  • Ich bin doof. Habe den Punkt vergessen: "%.16s" .



  • Hallo fichtl,

    20 72 75 6C 65
    

    entspricht aber nicht ".herr", sondern " rule".



  • dachschaden schrieb:

    Ich bin doof. Habe den Punkt vergessen: "%.16s" .

    Nein doof bist du nicht, kann jedem passieren.

    Ich wusste das man z.b. floats mit dem . formatieren kann, also wie viele Koma stellen und so.

    Aber dass das auch bei "Strings" geht, so was wusste ich nicht.

    Es steht aber auch in keinem meiner Bücher so was, gibt es den ein Buch das so ins Detail geht ?

    Grüsse



  • Th69 schrieb:

    Hallo fichtl,

    20 72 75 6C 65
    

    entspricht aber nicht ".herr", sondern " rule".

    Jap, hab da was mit dem Copy / Paste geschaft, was an Moderne Kunst grenzt. 🙂

    Das ende der Zeile sieht auch völlig anders aus als das hier am PC, wie gesagt, Copy / Paste Desaster.

    Edit:

    Nichts desto trotz, das problem wurde gelöst und ich hab viel dazu gelernt.



  • fichtl schrieb:

    Es steht aber auch in keinem meiner Bücher so was, gibt es den ein Buch das so ins Detail geht ?

    Erstens: DirkB hat dir bereits geschrieben, dass du plenkst.

    Zweitens: es gibt manpages da draußen, auch für printf .



  • fopen benutzt man - so auch in deinem Fall - meistens sinnvollerweise mit "rb" statt "r".



  • Wutz schrieb:

    fopen benutzt man - so auch in deinem Fall - meistens sinnvollerweise mit "rb" statt "r".

    Das ist mir klar, aber ich arbeite auf Linux und soviel ich verstanden habe, werden in Unixoiden allg. alle files im Binär-modus geöffnet.

    Unter Windows z.b. würd ich "rb" nutzen.

    oder habe ich da was falsch verstanden ?



  • Ja, du hast den Anspruch von C hinsichtlich Portabilität und Plattformunabhängigkeit ebenso wie UB (undefiniertes Verhalten) nicht verstanden.

    Du weißt jetzt, dass du unter Linux arbeitest und es unter Windows anders machen würdest.
    Das ist nicht professionell, ebenso ein Anspruch von C.
    Ein anderer und auch du selbst weiß es später aber eben nicht mehr, wobei dein Problem wie du dir sicher denken kannst, noch sehr überschaubar ist im Gegensatz zu Proficode.

    Wenn du also du Möglichkeit hast, etwas sofort für alle Plattformen lauffähig zu machen - und ich meine dabei ohne ifdef-Orgien - dann mache es auch sofort.



  • Wutz schrieb:

    Wenn du also du Möglichkeit hast, etwas sofort für alle Plattformen lauffähig zu machen - und ich meine dabei ohne ifdef-Orgien - dann mache es auch sofort.

    Ok, stimmt, wird so zukünftigt erledigt.


Anmelden zum Antworten