hex code aus recv()
-
Hi,
ich bin nciht unbedingt der erfahrenste in C++ und brauche deswegen mal eure Hilfe.
Ich habe ein Programm geschrieben, welches im Prinzip diverse Ports überwachen kann und halt die Daten aufnimmt, die dort hereinkommen.
Nun kriege ich über diese Ports von einem kleinen Sender einen 17Byte großen Hex Code rein.
Den würde ich nun auch gerne in einem char array haben, aber halt als original hex code damit ich den in einer Datenbank speichern kann.
Die Frage bezieht sich jetzt darauf, in was mein hex code umgewandelt wird wenn die recv() funktion ihn in das char array steckt. und wie bekomme ich ihn dann wieder umgewandelt?Danke schonmal
-
Da wird gar nichts in gar nichts umgewandelt. Ob Hex, Binär, Dezimal oder sonstwas ist nur eine Darstellung, also erst bei der Ausgabe (auf dem Bildschirm) relevant.
-
ok, und wie komme ich nun zu einer hexa darstellung in der ausgabe?
-
-
wenn ich bei
cout << hex << buf;
für buf ein char nehme wird leider überhaupt nichts angezeigt...
-
goody schrieb:
wenn ich bei
cout << hex << buf;
für buf ein char nehme wird leider überhaupt nichts angezeigt...
Für char hat der Operator << eine Sonderbehandlung, eben die, dass ein Zeichen anstatt einer Zahl ausgegeben wird. Vermutlich hat dein char einen Wert, der für ein nicht druckbares Zeichen steht. Du musst den char in einen int-Wert (oder einen anderen Ganzzahltyp != char) casten, damit du von der hex-Formatierung profitierst:
cout << hex << static_cast<int>(buf);
-
die variable habe ich folgendermaßen deklariert:
char buf[16];
dann halt in die recv() funktion eingesetzt und mit static_cast bekomme ich dann eine fehlermeldung wegen einer ungültigen typkonvertierung...
muss ich buf irgendwie anders deklarieren?sorry ich bin in der geschichte noch nicht ganz so drin...
-
goody schrieb:
die variable habe ich folgendermaßen deklariert:
char buf[16];
dann halt in die recv() funktion eingesetzt und mit static_cast bekomme ich dann eine fehlermeldung wegen einer ungültigen typkonvertierung...
muss ich buf irgendwie anders deklarieren?sorry ich bin in der geschichte noch nicht ganz so drin...
Da hast du ja auch kein char, sondern ein char-Array. Da gibt es keine sinnvolle Umwandlung in Integer. Und auch ich bin, wie der Compiler, ratlos was du damit eigentlich erreichen willst. Kannst du dein Problem nochmal genauer schildern?
-
also:
ich habe eine variable "buf"
in diese variable wird mit hilfe von recv() die einkommenden daten geschrieben.
nun möchte ich den inhalt als hexadezimal code ausgeben bzw. in einer datenbank speichern.char buf[16]; bytes = recv(socket,buf, sizeof(buf) - 1,0); cout << hex << static_cast<int>(buf);
das ist was ich im moment mir zusammengebastelt habe...
-
und wieso möchtest du es unbedingt als hex speichern?
einfach nur, weils eben toll ist, oder bildest du dir ein, das so machen zu müssen um irgendwas anderes machen zu können?
es hört sich nämlich nicht gerade sinnvoll an.bb
-
ok meiner auffassung nach brauche ich den hex string.
folgendes muss reinkommen:000F313233343536373839303132333435
die ersten vier zeichen sind eine 15 und die letzten sind quasi in ascii die zahlen 123456789012345
wenn du mir jetzt eine möglichkeit zeigst das in diese zwei teile zu teilen, vergess ich den hex kram und nehm deine lösung
-
Also:
Du hast irgendwoher einen Hex-String empfangen(wieso auch immer ist zwar egal - wäre aber mal interessant zu erfahren) und die ersten 4 Stellen beschreiben die Länge der dann folgenden Zahl(ascii-formatiert und nicht mehr hex)!?bb
-
richtig!
den code empfange ich von einem gps sender.
die 12345.... stellen die IMEI-nummer zur authentifizierung dar.ich würde es aus diversen anderen gründen wirklich gerne in der hex form in einer var gespeichert bekommen.
-
edit: ah - ich idiot : D ok - aber du hast ja jz die Lösung^^
-
Wow, ich habe ja schon einiges gesehen, aber das ist das kaputteste Design, von dem ich je gehört habe. Wie oft wird hier konvertiert? Ganz am Anfang steht eine Zahl, die als Reihe von Dezimalziffern vorliegt, deren hexadezimale ASCII-Zeichen als Ziffernfolge verschickt werden und dann willst du das alles wieder Rückgängig machen? Das sind 6 Umwandlungen anstatt einfach gleich die Zahl zu verschicken!
Aber meinetwegen:
#include <iostream> #include <sstream> using namespace std; int main() { const char empfangenes_char_array[]="000F313233343536373839303132333435"; // Erste 4 Zeichen in Längenvariable umwandeln stringstream converter; converter.write(empfangenes_char_array,4); unsigned laenge; converter >> hex >> laenge; cout<<"Länge der Zahl ist "<<laenge<<endl; // Rest des Strings von ASCII in Zahlen umwandeln long unsigned int zahl=0; for (const char* iterator = empfangenes_char_array + 4; *iterator != 0; iterator+=2) { char ziffer = (iterator[1] - '0') + (iterator[0] -'0') * 16 -'0'; zahl *= 10; zahl += ziffer; } cout << "Die Zahl ist: " << zahl <<"\nOder in Hex-Schreibweise: "<<hex<<zahl<<endl; }
Ausgabe (sofern unsigned long int groß genug ist):
Länge der Zahl ist 15 Die Zahl ist: 123456789012345 Oder in Hex-Schreibweise: 7048860ddf79