Array von Chars mit Hex Werten ausgeben



  • Hallo zusammen,

    als blutiger Anfänger versuche ich ein Array aus Chars gefüllt mit Hex-Werten als Debug Log auszugeben. Es klappt leider nicht 😞

    Mein Workaround sieht wie folgt aus:

    struct mg_str b = mg_mk_str_n(lb.buf, lb.len);
    for (int k=0; k<(int)b.len; k++) {
            LOG(LL_INFO, ("%.2x", b.p[k]));
        }
    

    Das gibt natürlich alles untereinander aus, was nicht lesbar ist.
    Ich hätte gedacht folgendes müsste klappen:

    LOG(LL_INFO, ("%.*x", (int)b.len, b.p));
    

    Würde gehen aber dabei kommt es zu einem Fehler beim kompilieren den ich nicht verstehe, weil:

    LOG(LL_INFO, ("%.*s", (int)b.len, b.p));
    

    Dieser Code funktioniert, allerdings habe ich dann die ASCII Zeichen...ebenfalls nicht lesbar.
    Hat jemand einen Tipp für mich?

    Vielen Dank und viele Grüße



  • @HeckMc sagte in Array von Chars mit Hex Werten ausgeben:

    Hat jemand einen Tipp für mich?

    Nein. Woher sollen wird wissen was LOG(LL_INFO, ("%.*x", (int)b.len, b.p)); bedeuted?

    Mit der Fehlermeldung rückst du auch nicht raus.



  • @HeckMc sagte in Array von Chars mit Hex Werten ausgeben:

    struct mg_str b // ...
    

    Sehr ungewöhnlich für C ++.

    @HeckMc sagte in Array von Chars mit Hex Werten ausgeben:

    ("%.2x", b.p[k])
    

    Weißt Du was der Kommaoperator macht?

    Anyway:

    #include <sstream>
    #include <iomanip>
    
    // ...
    
    auto b = mg_mk_str_n(lb.buf, lb.len);
    std::stringstream ss;
    for (decltype(b.len) k = 0; k < b.len; ++k)    
        ss << std::setfill('0') << std::setw(2) << std::hex << b.p[k] << ' ';
    LOG(LL_INFO, ss.str().c_str());
    


  • Das liegt an der Impementierung von LOG.

    Wenn der rechte Teil in Klammern dem Formatstring von printf entspricht, dann macht *"%.x" nicht das was du möchtest.
    Zudem wird b.p ein Zeiger sein, der sich mit %x nicht verträgt. (Aber das sollte "nur" eine Warnung geben und keinen Fehler - Mist kommt trotzdem raus)

    @HeckMc sagte in Array von Chars mit Hex Werten ausgeben:

    Hat jemand einen Tipp für mich?

    Beschäftige dich mit der man-page zu deinem LOG. Da sollte es noch mehr gben.
    Wie es aussieht, macht das nach einer Log-Ausgabe automatisch ein '\n'. Dies musst du unterdrücken.
    Evtl gibt es noch Modifier zu dem LL_INFO.



  • Hallo manni66,

    mir war nicht klar, dass dies eine besondere Funktion ist. Vereinfacht scheint dahinter ein printf zu stecken soweit ich es verstehe.
    Also könnte dort auch stehen:

    printf("%.*x", (int)b.len, b.p);
    

    bzw.

    printf("%.*s", (int)b.len, b.p);
    

    Ich bin davon ausgegangen, dass der Fehler den ich gemacht habe sehr trivial ist von daher habe ich die Fehlermeldung nicht gepostet:

    error: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'const char *' [-Werror=format=]

    Mir ist schon klar, dass es am Format liegt, weiß aber nicht wie ich es lösen könnte.

    Grüße



  • @Swordfish sagte in Array von Chars mit Hex Werten ausgeben:

    @HeckMc sagte in Array von Chars mit Hex Werten ausgeben:

    ("%.2x", b.p[k])

    Ist das ein Kommaoperator oder eine Kapselung für ein Makro?



  • Danke für den Tipp mit dem LL_INFO ich denke damit setze ich mich erstmal auseinander.

    Es scheint ein Makro zu sein, habe noch folgendes in der Konsole gefunden:
    note: in definition of macro 'LOG'
    cs_log_printf x;

    Grüße



  • @DirkB sagte in Array von Chars mit Hex Werten ausgeben:

    @Swordfish sagte in Array von Chars mit Hex Werten ausgeben:

    @HeckMc sagte in Array von Chars mit Hex Werten ausgeben:

    ("%.2x", b.p[k])

    Ist das ein Kommaoperator oder eine Kapselung für ein Makro?

    An ein Makro habe ich nicht gedacht. Hätte ich mir bei einem Logger und LOG aber denken können sollen müssen.

    So einfach wird man das Newline wohl nicht loswerden wenn man den String nicht vorher zusammenbaut:

    cs_log_printf:

    void cs_log_printf(const char *fmt, ...) PRINTF_LIKE(1, 2);

    Prints log to the current log file, appends "\n" in the end and flushes the stream.



  • Das habe ich zwischenzeitlich auch in der Doku gefunden....ich hänge aber auch nicht am Log...wenn es irgendwie in die Konsole geht und lesbar ist ist mir inzwischen alles recht 😉



  • @HeckMc Was ist mit meinem Code oben? Tut der nicht?



  • @Swordfish sagte in Array von Chars mit Hex Werten ausgeben:

    @HeckMc Was ist mit meinem Code oben? Tut der nicht?

    Geht es denn um C++?



  • @DirkB Solange der Thread im C++-Forum ist und der OP auch nicht sagt daß es C sein soll?



  • @Swordfish sagte in Array von Chars mit Hex Werten ausgeben:

    und der OP auch nicht sagt

    Der Kurs hieß bestimmt C++ Programmierung



  • @Swordfish ich habe deinen Code vorhin gar nicht gesehen, da meine Antwort nach dem Schreiben quasi alles nach oben geschoben hat. Werde es aber sofort testen und eine Rückmeldung geben. update Der Code kompiliert leider nicht. Zwischenzeitlich hab ich den Fehler aber gefunden und behoben für den ich die Ausgabe bauen wollte. Trotzdem würde es mich jetzt natürlich interessieren wie es machbar wäre.

    error: type defaults to 'int' in declaration of 'c' [-Werror=implicit-int] auto b = mg_mk_str_n(lb.buf, lb.len);
    error: incompatible types when initializing type 'int' using type 'struct mg_str' auto b = mg_mk_str_n(lb.buf, lb.len);
    error: expected expression before ':' token std::stringstream ss;
    error: implicit declaration of function 'decltype' [-Werror=implicit-function-declaration] for (decltype(b.len) k = 0; k < b.len; ++k)
    error: request for member 'len' in something not a structure or union for (decltype(b.len) k = 0; k < b.len; ++k)
    error: expected ';' before 'k' for (decltype(b.len) k = 0; k < b.len; ++k)
    error: 'k' undeclared (first use in this function) for (decltype(b.len) k = 0; k < b.len; ++k)
    error: request for member 'len' in something not a structure or union for (decltype(b.len) k = 0; k < b.len; ++k)
    error: 'ss' undeclared (first use in this function) ss << std::setfill('0') << std::setw(2) << std::hex << b.p[k] << ' ';
    error: 'std' undeclared (first use in this function) ss << std::setfill('0') << std::setw(2) << std::hex << b.p[k] << ' ';
    error: expected ';' before ':' token ss << std::setfill('0') << std::setw(2) << std::hex << b.p[k] << ' ';
    error: statement with no effect [-Werror=unused-value] cs_log_printf x;
    usw.

    @DirkB die Frage habe ich mir auch schon gestellt 😃 das Framework ist Mongoose OS und dort wird immer C/C++ angegeben. Ein Programmierkurs ist es nicht sondern eine gegebene FW an der ich etwas ausprobieren möchte...und da stoße ich mit meinen Grundkenntnissen in Programmierung eben auf solche Probleme.
    update Ich habe mal etwas weiter geschaut und es heißt tatsächlich auf der Quick Start Seite des Frameworks: In this guide we will learn how to implement device logic in C/C++. Die Source Datein des Frameworks sind auch alles .c files wohingegen alle Files der FW .cpp sind. Daher bin ich - ohne Vorkenntnisse in C/C++ - von C++ ausgegangen. Da mein Bekannter dem ich helfen möchte auch immer von C++ FW gesprochen hat hab ich das erstmal nicht in Frage gestellt.

    Danke für eure Hilfe.



  • @HeckMc C und C++ sind zwei verschiedene Programmiersprachen. C++ ist zwar mal als Erweiterung von C entstanden, hat sich aber kräftig weiter entwickelt.

    Ein C++ Compiler kann auch C. Das erkennt er meistens an der Dateierweiterung .c (es gibt auch Schalter dafür).
    Wenn du in einer .c-Datei C++ benutzt, geht das schief.

    Man kann auch C-Bibliotheken in C++ nutzen.

    struct mg_str b = mg_mk_str_n(lb.buf, lb.len);
    for (int k=0; k<(int)b.len; k++) {
        printf ("%02x ", b.p[k]));
    }
    

    sollte dein Problem lösen.



  • Danke, das behebt es tatsächlich...noch ein printf("\n"); nach der for Schleife und es klappt.


Log in to reply