Von char* zu unsigned char*



  • Hab mir halt folgendes gedacht:

    // Speicher freimachen
    char *pszSignatureFixed = new char[strlen(pszSignature) + 1];
    // Länge der Signatur (vom String her)
    unsigned short iLengthxx = strlen(pszSignature);
    
    // Durchlaufen von jedem Abschnitt ab \, also i von 0-3 wäre \x56, 4-7 wäre \x8B usw
    for (unsigned short i = 0; i < iLengthxx; i += 4)
    {
        // Nur wenn i + 4 < als Länge ist (sonst Crash)
        if (i + 4 < iLengthxx)
        {
            // Speicher freimachen
            char *pszTemp = new char[4];
            // Abschnitt zu einem \x<i + 2><i + 3> zusammenfügen, wenn i = 0 wäre es \x56
            sprintf(pszTemp, "\\x%i%i", pszSignature[i + 2], pszSignature[i + 3]);
            // Nun zu pszSignatureFixed den String als Byte hinzufügen durch %x in sprintf
            sprintf(pszSignatureFixed, "%x%x", pszSignatureFixed, pszTemp);
    
            // Speicher freigeben
            delete[] pszTemp;
        }
    }
    

    EDIT: Wieso sollte das ein fail sein?!
    EDIT2: Oh man ^^ In Python wäre das mit einem binascii.unhexlify einfach getan 😕

    Gruß



  • hex0r schrieb:

    theliquidwave schrieb:

    Hi.
    Hab mal das hier gebastelt, das liefert aber komplett falsche Ergebnisse 😕

    char *pszSignatureFixed = new char[strlen(pszSignature) + 1];
    				unsigned short iLengthxx = strlen(pszSignature);
    
    				for (unsigned short i = 0; i < iLengthxx; i += 4)
    				{
    					if (i + 4 < iLengthxx)
    					{
    						char *pszTemp = new char[4];
    						sprintf(pszTemp, "\\x%i%i", pszSignature[i + 2], pszSignature[i + 3]);
    						sprintf(pszSignatureFixed, "%x%x", pszSignatureFixed, pszTemp);
    
    						delete[] pszTemp;
    					}
    				}
    

    Gruß und Danke

    Beschreib mal in Worten, was der Code machen soll. So ist es ein wenig äh ... undurchsichtig, um es mal vorsichtig zu formulieren.

    Duju wanna want sowas hier? Guggsu brazza:

    string str;
    	char* s = "\x41\x42\x43\x2D\x4B\x6F\x6D\x70\x6C\x69\x63\x61\x74\x30\x72";
    	while(*s)
    		str += *s++;
    	cout << str << endl;
    

    😉



  • theliquidwave schrieb:

    Hab mir halt folgendes gedacht:

    // Speicher freimachen
    char *pszSignatureFixed = new char[strlen(pszSignature) + 1];
    // Länge der Signatur (vom String her)
    unsigned short iLengthxx = strlen(pszSignature);
    
    // Durchlaufen von jedem Abschnitt ab \, also i von 0-3 wäre \x56, 4-7 wäre \x8B usw
    for (unsigned short i = 0; i < iLengthxx; i += 4)
    {
        // Nur wenn i + 4 < als Länge ist (sonst Crash)
        if (i + 4 < iLengthxx)
        {
            // Speicher freimachen
            char *pszTemp = new char[4];
            // Abschnitt zu einem \x<i + 2><i + 3> zusammenfügen, wenn i = 0 wäre es \x56
            sprintf(pszTemp, "\\x%i%i", pszSignature[i + 2], pszSignature[i + 3]);
            // Nun zu pszSignatureFixed den String als Byte hinzufügen durch %x in sprintf
            sprintf(pszSignatureFixed, "%x%x", pszSignatureFixed, pszTemp);
    
            // Speicher freigeben
            delete[] pszTemp;
        }
    }
    

    😕


  • Mod

    ABC-Komplicat0r schrieb:

    Duju wanna want sowas hier? Guggsu brazza:

    string str;
    	char* s = "\x41\x42\x43\x2D\x4B\x6F\x6D\x70\x6C\x69\x63\x61\x74\x30\x72";
    	while(*s)
    		str += *s++;
    	cout << str << endl;
    

    😉

    Sowie ich das verstanden habe, hat er diesen Fall:

    char* s = "\\x41\\x42\\x43\\x2D\\x4B\\x6F\\x6D\\x70\\x6C\\x69\\x63\\x61\\x74\\x30\\x72";
    

    Also in dem char[] steht wirklich "\x41" statt "A".



  • theliquidwave schrieb:

    EDIT2: Oh man ^^ In Python wäre das mit einem binascii.unhexlify einfach getan 😕

    char* s = "\x41\x42\x43\x2D\x4B\x6F\x6D\x70\x6C\x69\x63\x61\x74\x30\x72";
    	string unhexlificat0r(s);
    	cout << unhexlificat0r << endl;
    


  • noch mal auf deutsch:

    du willst aus nem '\0xAB' ein 'A' 'B' machen, wobei A und B beliebige Zeichen sind!?

    also z.bsp.
    \0xAB\0xCD\0xEF
    -> ABCDEF

    richtig?

    falls ja z.bsp. mittels std::string und std::find + std::string::erase
    bzw std::string und std::string::substring



  • SeppJ schrieb:

    Sowie ich das verstanden habe, hat er diesen Fall:

    char* s = "\\x41\\x42\\x43\\x2D\\x4B\\x6F\\x6D\\x70\\x6C\\x69\\x63\\x61\\x74\\x30\\x72";
    

    Also in dem char[] steht wirklich "\x41" statt "A".

    Wenn das so ist, geht auch mit dem sstream Gelumpe, oder so:

    char* s = "\\x41\\x42\\x43\\x2D\\x4B\\x6F\\x6D\\x70\\x6C\\x69\\x63\\x61\\x74\\x30\\x72";
    	string ungehexlyficated;
    	while(*s)
    	{
    		if (*s == 'x')
    		{
    			s++;
    			ungehexlyficated += strtoul(s, &s, 16);
    		}
    		s++;
    	}
    
    	cout << ungehexlyficated << endl;
    

    mfg,
    hexli mexli



  • Hi.
    Ich habs endlich 🙂
    atol bzw. strtol regelt 🙂

    Danke an alle für die Mühe 😉

    Gruß



  • EDIT: Gelöscht, bringt nix


Anmelden zum Antworten