Von char* zu unsigned char*
-
@ doooomi: Genau so ist es ja auch, dass ist doch mein Problem

~ Chris
-
Du musst keinen neuen Speicher mit new anfordern, sondern einfach den bestehenden anders interpretieren (reinterpret_cast).
char *pszSignature = m_pSettings->getString(pszBaseName, "signature"); unsigned char *pszSignatureFixed = reinterpret_cast<unsigned char*>(pszSignature);
-
Bringt trotzdem nichts da dooomi's Annahme wohl korrekt ist.
Trotzdem danke
Das liegt wohl daran, dass die Signatur in etwa so vorliegt:
pszSignature[0] = '\\'; pszSignature[1] = 'x'; pszSignature[2] = '5'; pszSignature[3] = '6'; // ...Und nicht so:
pszSignature[0] = '\x56';Gruß
-
theliquidwave schrieb:
... unsigned char *pszSignatureFixed = new unsigned char[strlen(pszSignature) + 1]; pszSignatureFixed = reinterpret_cast<unsigned char*>(pszSignature); ......
char* pszSignature = {"\x56\x8B\xF1\x8B\x06"}; unsigned char* pszSignatureFixed = new unsigned char[strlen(pszSignature) + 1]; // pszSignatureFixed = reinterpret_cast<unsigned char*>(pszSignature);// Fehler! // Es ist Quatsch den Zeiger den new geliefert hat zu überschreiben. memcpy(pszSignatureFixed, pszSignature, strlen(pszSignature)+1); // ist nach new folgerichtig // und beinhaltet nebenbei den Cast.
-
Hi.
Danke für den Code, aber dennoch funktioniert das nicht, da die Bytes nicht mehr als Bytes vorliegen
Siehe meinen letzten Post.
Gruß und Danke
-
theliquidwave schrieb:
Danke für den Code, aber dennoch funktioniert das nicht, da die Bytes nicht mehr als Bytes vorliegen

Dann solltest Du ermitteln, warum die Bytes nicht mehr als Bytes vorliegen. Am Cast kann es nicht liegen, insofern ist die Frage beantwortet.
Und um die Folgefrage zu beantworten, hast Du bislang nicht genug Infos geliefert.
EDIT: Oder suchst Du jetzt eine Möglichkeit, den als '\', 'x', '5', '4' vorliegenden String in ein (unsigned) char mit dem Wert '\x45' umzuwandeln?
-
LordJaxom schrieb:
EDIT: Oder suchst Du jetzt eine Möglichkeit, den als '\', 'x', '5', '4' vorliegenden String in ein (unsigned) char mit dem Wert '\x45' umzuwandeln?
Ist das ein Byte=
-
Hi.
Ja, genau das suche ich @ LordJaxom.
Ich dachte ihr habt das bereits verstanden, tut mir leid wenn ich das nicht ordentlich genug erklärt habe.Gruß und Danke
-
char* s = "\x45\x55\56\57\FF"; while (*s) printf("%X", *s++);und wo ist das problem?
-
Dass dies das C++ Forum ist, geh nach C mit deinem dreckigen prntffffff

-
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
-
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.
-
char *pszTemp = new char[4];no comment. epic fail!
char pszTemp[4];
-
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; } }
-
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
-> ABCDEFrichtig?
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