std::string in dezimal/bin



  • Hallo zusammen.

    Bin grad ein wenig verwirrt und komm nicht raus aus'm Loch.

    Ich habe folgenden std::string extrahiert bzw. 'zugeschmissen' bekommen (liegt mir als std::string-Variable zu Füßen):

    0xABBABEEFACDC // bzw. std::string data ( "0xABBABEEFACDC" );
    

    Der string ist hex-kodiert wie man unschwer erkennen kann. Was ich jetz brauch sind genau diese hex-Werte der Buchstaben und nicht deren ASCII-Wert jeweils in Byte. Also in der Art:

    unsigned char byte1 ( 0xAB ); // bzw unsigned char byte1 ( 171 );
    unsigned char byte2 ( 0xBA ); // bzw unsigned char byte2 ( 186 );
    //...
    

    Wenn ich Stelle für Stelle durch den String lauf (lassen wir das '0x' mal weg), bekomme ich für 'A' logischer Weise '0x41' bzw. '65' usw.. Das bringt mich allerdings nicht weiter da ich mit Werten '1010' bzw. '10' arbeiten muss (Bit-Masken drüber, shiften, all das was man halt so macht...).

    Weis nicht genau wie ich mich verständlich ausdrücken soll (od vllt is ja schon klar?), wäre aber über jedliche Hilfe dankbar.

    m.



  • Hab ich es richtig verstanden: Du willst den numerischen Wert jeder einzelnen Hexadezimal-Stelle haben?

    int parse_hexdigit(char hex) {
        if (hex >= 'a' and hex <= 'f')
            return hex - 'a' + 10;
        else if (hex >= 'A' and hex <= 'F')
            return hex - 'A' + 10;
        else if (hex >= '0' and hex <= '9')
            return hex - '0';
        assert(false); // Ungültige Ziffer.
    }
    


  • zur not selber schreiben (hexadezimal in binär zu wandeln ist ja wohl nicht so schwer), aber das Problem wurde schon tausend mal Gelöst, also such mal unter google.



  • Uhh...peinlich. Hab beim drüberlesen vor'm absenden wohl knallhart einen Satz rausgelöscht oder glatt vergessen reinzuschreiben: Gibt's da was an Bord von C++ das mir das abnimmt?

    Wie richtig vermutet, will ich die Dezimal-Werte und auch das Umwandeln sollte nicht das Problem sein. Dacht nur das es vllt schon was in der Art gibt. Und das Rad muss man ja nicht immer neu erfinden, oder? 😉

    Vielen Dank!

    m.



  • Für einzelne Zeichen gibt's soweit ich weiß keine Bordmittel. Wenn Du den ganzen Stringwert haben willst, kannst Du Dich aber der Streams und IO-Manipulatoren bedienen:

    int main() {
        string hx ="0xdeadbeef";
        unsigned int dc;
        stringstream sstr;
        sstr << hx;
        sstr >> hex >> dc;
        cout << dc << endl;
    }
    

    Hier wird der String in einen Stream eingelesen und dann als unsigned int[/c} wieder ausgelesen. Der Trick ist der mit-angegebene [c]hex -Manipulator, der dafür sorgt, dass die Stringeingabe als Hexadezimalzahl interpretiert wird. Lustigerweise akzeptiert das sogar das "0x" davor (es geht aber auch ohne).



  • Hui, des is ned schlecht. Unbedingt merken. Danke hierfür!

    Da mein string allerdings mal so und mal so lang ist, muss ich mich auf das Byte-weise abarbeiten beschränken.

    Danke an die bisherigen Antworten. Die Frage is beantwortet. Merce!

    m.


Log in to reply