u_char array für mysql-query konvertieren?



  • Hallo,

    ich hab folgendes Problem:

    ich habe eine MAC-Addresse in einem u_char array von 6 Byte Länge, wie in diesem Beispiel:

    u_char mac[]= { 0x00, 0x80, 0xef, 0x87, 0x45, 0xcb};

    Nun habe ich die MAC-Addresse einiger Netzwerkgeräte in einer Mysql Datenbank in einem varchar-Feld mit der Länge 12 hinterlegt.

    Ein Datenbankeintrag sähe also so aus: 0080ef8745cb

    Nun müchte ich gerne in meinem C++-Programm ein Query ausführen, welches nach der MAC-Addresse in der Datenbank sucht.

    Nun ergibt sich das Problem, dass die MAC-Adresse im u_char array pro Byte zwei Zeichen hat, insgesamt also eine Länge von sechs, ich aber in meiner Query ein String mit einer länge von 12 brauche.

    Wie könnte ich die u_chars so konvertieren, das ich die Werte der u_char Bytes in einem zwölf Zeichen String habe?

    Ich hoffe ich habe das Problem halbwegs verständlich gemacht.
    Für jede Hilfe wäre ich sehr Dankbar.



  • "byte to hex" wäre das Stichwort.

    Müßte so ähnlich gehen:

    #include <strstream>
    #include <iomanip>
    
    std::string mac_string(const unsigned char mac[6])
    {
      std::ostringstream ostr;
    
      for(int i=0; i<6; i++)
        ostr << std::ios::hex << std::ios:setfill('0') << std::ios::setw(2) << (int)mac[i]; // <- (int) added!!!
    
      return ostr.str();
    }
    


  • Bei mir klappt's so:

    #include <sstream>
    #include <iomanip>
    
    std::string mac_string(const unsigned char mac[6]) {
    
      std::ostringstream oss;
      oss << std::hex << std::setfill('0') << std::setw(2);
      for(int i = 0; i < 6; ++i) oss << int(mac[i]);
      return oss.str();
    }
    


  • Hallo DStefan,

    habe gerade noch meinen Beitrag editiert: (int).

    Bei std::hex bin ich mir nicht sicher, ob der nicht (laut Standard) nur für die nächste Ausgabe gilt? std::setfill und std::setw sollten aber vor der Schleife gehen.



  • Th69 schrieb:

    Bei std::hex bin ich mir nicht sicher, ob der nicht (laut Standard) nur für die nächste Ausgabe gilt?

    Dann schau doch im Standard nach, oder in der Referenz deiner Wahl 🙂

    http://www.cplusplus.com/reference/iostream/manipulators/hex/ aufmerksam lesen, da stehts (zugegebenermaßen ein wenig zwischen den Zeilen).



  • Hallo pumuckl,

    ich hatte mich auch vertan, ich meinte 'std::setw'.
    Und dort (http://www.cplusplus.com/reference/iostream/manipulators/setw/) steht 'for the next insertion operation'. Also wird die Breite wieder auf den Standardwert zurückgesetzt, oder?

    Und zu std::hex habe ich dies aber nicht explizit gefunden (was meinst du mit 'zwischen den Zeilen'?).

    Jedoch ist doch generell nichts gegen meinen Source-Code zu sagen (den ich auch einfach so hingeschrieben hatte)?



  • Ihr seid super vielen Dank!!! Hab echt lange an dem Problem gefrikelt und dann löst ihr es mit einem 5 Zeiler 🙂

    Ach ja, die
    "oss << std::hex << std::setfill('0') << std::setw(2);" Anweisung muss tatsächlich in die for-Schleife, da setw() nur für die nächste Insertion gilt und dann zurück gesetzt wird.

    Also vielen Dank noch mal.


Anmelden zum Antworten