dezimal -> hexadezimal



  • (Sorry, falls das hier die falsche Kategorie sein sollte)

    Hey,

    ich habe bis jetzt immer hexadezimale Befehle per write() an ein serielles Gerät geschickt. Das hat bislang so geklappt:

    write (fd2, "\x00\x34\x3", 3);
    

    Das Problem ist, dass ich jetzt an stelle des letzten Wertes, also der "3", einen beliebigen Wert setzen möchte, welcher aus einer Datenbank ausgelesen wird (0-255). Wie bekomme ich das hin, dass der Inhalt einer Variable mit \x zu einem hexadezimalen Ausdruck wird? Wenn ich die Variable hinter das \x klemmen will, dann meckert der Kompiler wegen fehlender Zahlen..

    "\x" + variable
    //klappt nicht..
    

    Ich konnte ihn bis jetzt nur ins Format 0x00 bringen, aber so wird es wieder als char, und nicht als hex verschickt bzw. geschrieben..

    Danke schon mal im Voraus, bin gerade echt ab verzweifeln... 😃

    J.LI


  • Mod

    Zahlenwerte haben kein Format. Dezimal und Hexadezimal sind Arten und Weisen, wie man Zahlenwerte als Zeichenketten darstellen kann. Solange hier keine Zeichenketten im Spiel sind, ist die Frage müßig.

    edit: Nach mehrmaligem Lesen deines Beitrags, bin ich mir nicht mehr sicher, ob das überhaupt deine Frage war. Aber ich habe keine Ahnung mehr, was überhaupt deine Frage genau ist. 😕



  • Dein

    write (fd2, "\x00\x34\x3", 3);
    

    kannst du auch so schreiben

    char const message[] = { 0, 0x34, 3 };
    write (fd2, message, 3);
    

    MachtBewirkt genau das selbe.
    Den 3er darin jetzt gegen was Variables zu ersetzen sollte trivial sein, nen? 🙂


  • Mod

    Ich glaube, ich weiß jetzt, was du genau meinst. Hier ein kurzes Beispielprogramm:

    #include <unistd.h>
    
    int main()
    {
      write(1, "abc\n", 4);
      write(1, "\x61\x62\x63\n", 4);
      write(1, "\141\142\143\n", 4);
      write(1, "\u0061\u0062\u0063\n", 4);
    
      char abc[] = "abc\n";
      write(1, abc, 4);
      abc[0] = 'a';
      write(1, abc, 4);
      abc[0] = 0x61;
      write(1, abc, 4);
      abc[0] = '\x61';
      write(1, abc, 4);
      abc[0] = 97;
      write(1, abc, 4);
      abc[0] = 0141;
      write(1, abc, 4);
      abc[0] = 'b' - 1;
      write(1, abc, 4);
    }
    

    Dies gibt, unter der Annahme, dass dein Computer ASCII oder einen kompatiblen Zeichensatz benutzt, sehr oft "abc" aus. Es ist völlig egal in welcher Form die Werte angegeben wurden. Denn wie oben erklärt, haben Zahlenwerte (Zeichen sind auch nur Zahlen) intern kein Format.

    Ist die Frage damit beantwortet? Oder geht es eher darum, wie du eine Zahl mit einer Zeichenkette verheiraten kannst? Die Antwort darauf hängt vom Kontext ab. Falls die Zeichenkette eine fixe Länge hat, dann kannst du es beispielsweise so machen wie ich in meinem Beispiel. Falls das ganze dynamisch sein soll, dann bist du besser beraten, std::string oder std::stringstream zu benutzen, um die Zeichenketten zusammen zu basteln (was besser geeignet ist, kommt wieder auf den Kontext an).

    Achtung: "ab" + 'c' ist nicht "abc" !



  • hustbaer schrieb:

    Dein

    write (fd2, "\x00\x34\x3", 3);
    

    kannst du auch so schreiben

    char const message[] = { 0, 0x34, 3 };
    write (fd2, message, 3);
    

    MachtBewirkt genau das selbe.
    Den 3er darin jetzt gegen was Variables zu ersetzen sollte trivial sein, nen? 🙂

    Ohh mann.. 😃

    Danke dir!:)



  • Es geht auch nacheinander

    char variable = 3;
    write (fd2, "\x00\x34", 2);
    write (fd2, &variable , 1);
    

    Und wenn du nicht die Filefunktionen von Posix nimmst, kannst du auch die Standardfunktionen (für formatierte Ausgabe) wie cout oder fprintf, fpots, fputc nehmen.


Log in to reply