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.