C++ string Hex-zahl zuweisen



  • SITDnow schrieb:

    Das mit den Zeichenweise übergeben müsste funzen - aber ich wollte vorher noch mal kucken obs nicht auch kürzer geht ^^

    string text = "\x50\x44\x46";
    

    So?
    Bin mir aber gerade nicht sicher ob die Notation tatsächlich so in C++ funktioniert.



  • Memphis1978 schrieb:

    Wie mache ich das?

    Du besorgst dir den Zeichencode des entsprechenden Zeichens aus deinem String und gibst ihn als Hexzahl aus.

    int c = "!!"[0];
    std::stringstream ss;
    ss << std::hex << c;
    


  • Ah danke Registrierter Troll ^^

    Das ich da nicht selbst drauf gekommen bin - besonders da ich das schon benutzt habe für deutsche umlaute 😣



  • Hey,

    Da wir schon mal beim Thema war - mal noch ne etwas andere Frage:

    Nun bekomme ich die hexcode als string übergeben

    also ziel ist:

    von
    string hexcode="0xFF50FF";
    nach
    string hexstring="\xFF\x50\xFF"

    umzuwandeln.

    Die einzige Möglichkeit die mit auf Anhieb einfällt würde mit 16² if abfragen
    enden, pro hex zahl...

    da gibts doch bestimmt noch ne andere Lösung...



  • Zwei Zeichen, oder? 💡



  • Warum liest Du die Datei nicht in ein std::vector<unsigned char> ein und suchst dann mit Funktionen aus <algorithm>?
    Simon



  • SITDnow schrieb:

    von
    string hexcode="0xFF50FF";
    nach
    string hexstring="\xFF\x50\xFF"

    #include <sstream>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	string   hexcode("0xFF50FF"), hexstring;
    	const string b("/x");
    	istringstream  ss(hexcode); 
    	char a, c;
    
    	ss >> a >> a;
    	while (true) {
    		ss >> a >> c;
    		if (ss.eof()) 
    			break;
    		hexstring += b;
    		hexstring += a;
    		hexstring += c;
    	}
    	cout << "Aus " << hexcode << " wird " << hexstring <<  endl;
    }
    

    😉



  • SITDnow schrieb:

    von
    string hexcode="0xFF50FF";
    nach
    string hexstring="\xFF\x50\xFF"

    Ich behaupte mal, dass du das nicht wirklich willst. Die Escape-Sequenzen werden ja vom Compiler interpretiert, zur Laufzeit bringt dir so ein String nichts.
    Du willst vermutlich eher den Hexcode-String durchlaufen und immer jeweils 2 Hexziffern als ein Byte interpretieren: FF -> 255, 50 -> 80, FF -> 255. Die Bytes kannst du dann an einen String hängen.



  • Mh... ich muss daran arbeiten mich klarer auszudrücken 🙂
    ich versuchs mal so:

    string hexcode="0x2521";
    string hexstring=hexfkt(hexcode);
    
    cout<<"hexcode: "<<hexcode<<" ist hexstring:"<<hexstring<<endl;
    

    Ausgabe:
    hexcode: 0x2521 ist hexstring: %!

    Also die "hexfkt" soll einen hexcode aufnehmen (in "schriftform"), und diesen dann als string übergeben.

    das ist ungefähr das selbe als wenn ich
    char a='65';
    zu
    char b=(char) 65; //b='A'
    machen wollte.

    Hm ich glaube das einzige Problem ist das ich die Hexzahl nicht als Zahl sondern eben als Zeichenkette habe...



  • Ich habs jetzt mal jetzt mit Hilfe der Ascii tabelle gelöst...
    Obwohl es bestimmt eine wesentlich kürzere/leichtere/bessere/schnellere Lösung gibt. (code könnte auch noch überarbeitet bzw gekürzt etc werden)

    string hexString(string hexcode)
    
    {
    
        string hexstring="";
        int size=hexcode.length(),y,number; 
        char x[size];
    
        strncpy(x,hexcode.c_str(),size);
        x[size]='\0';
    
        //remove "0x"
        if(  x[0]=='0' && (x[1]=='x' || x[1]=='X')  )
        {
           for(int i=0;i<size;i++)
             x[i]=x[i+2];        
    
           x[size-2]='\0';
           size-=2;
        } 
    
        //get number
        for(int i=0;i<size;i+=2)
        {
             number=0;
             y= (int) x[i]-48;
    
             if(y>17)
                 y-=7;          
             number+=(y*16);
    
             y= (int) x[i+1]-48;         
    
             if(y>17)
                 y-=7;
    
             number+=y;  
    
             hexstring+= (char) number;
        }  
        return hexstring;
    
    }
    

Anmelden zum Antworten