hex code aus recv()


  • Mod

    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...


  • Mod

    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^^


  • Mod

    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
    

Anmelden zum Antworten