Von char* zu unsigned char*
-
Hi.
Ich stehe gerade vor einem Problem das ich nicht gelöst kriege. Ich habe eine Signatur für eine Funktion im char* Format vorliegen, hier ist deren Inhalt:"\x56\x8B\xF1\x8B\x06\xFF\x90\xB8\x04\x00\x00\x8B\x86\xE8\x0D\x00\x00\x85\xC0\x74\x0E\x8B\x50\x18\x85\xD2\x74\x07\x8B\x48\x1C\x03\xCE\xFF\xD2"Problem ist: Ich brauch den Kram als unsigned char*. Ein einfaches casten geht nicht, da der Compiler die einzelnen Bytes nicht als char ansieht.
Es muss also so aussehen (später):unsigned char *pszSignatureFixed = {\x56, \x8B, \xF1, \x8B, \x06, ...};Wie kriege ich das hin?
Das funktioniert leider auch nicht:for (unsigned int i = 0; i < strlen(pszSignature); i += 4) { pszSignatureFixed[i] = 0x0 + pszSignature[i + 2] + pszSignature[i + 3]; }Gruß und Danke!
-
theliquidwave schrieb:
Ein einfaches casten geht nicht, da der Compiler die einzelnen Bytes nicht als char ansieht.
Doch, einfaches (reinterpret-)casten "geht"...
-
Hi.
Nein, dass geht nicht.char *pszSignature = m_pSettings->getString(pszBaseName, "signature"); unsigned char *pszSignatureFixed = new unsigned char[strlen(pszSignature) + 1]; pszSignatureFixed = reinterpret_cast<unsigned char*>(pszSignature); Msg("Manuell eingegeben: %s\nUngecastet: %s\nGecastet: %s\n", (unsigned char*)"\x56\x8B\xF1\x8B\x06\xFF\x90\xB8\x04\x00\x00\x8B\x86\xE8\x0D\x00\x00\x85\xC0\x74\x0E\x8B\x50\x18\x85\xD2\x74\x07\x8B\x48\x1C\x03\xCE\xFF\xD2", pszSignature, pszSignatureFixed);Maneull eingegeben: <kryptische Zeichen, so wie ich es brauche> Ungecastet: \x56\x8B\xF1\x8B\x06\xFF\x90\xB8\x04\x00\x00\x8B\x86\xE8\x0D\x00\x00\x85\xC0\x74\x0E\x8B\x50\x18\x85\xD2\x74\x07\x8B\x48\x1C\x03\xCE\xFF\xD2 Gecastet: \x56\x8B\xF1\x8B\x06\xFF\x90\xB8\x04\x00\x00\x8B\x86\xE8\x0D\x00\x00\x85\xC0\x74\x0E\x8B\x50\x18\x85\xD2\x74\x07\x8B\x48\x1C\x03\xCE\xFF\xD2~ Chris
-
stell doch die projektopionen so ein, das char unsigned behandelt wird.
-
Hi.
Das geht schlecht da ich noch ein paar mehr char's habe und diese nicht als unsigned möchte.
Die Datei die ich parse wird mittels Funktionen von VALVe ausgelesen (Spielehersteller) und dieser Parser liefert nur const char's zurück.Gruß und Danke.
-
Ich denke nicht, daß dein Problem wirklich mit dem Casten zu tun hat. Für mich sieht es eher so aus, als ob in deinem pszSignature der String schon genau wortwörtlich so drin steht, wie er am Ende ausgegeben wird, also mit "echten" Backslashes und Ziffern statt denn richtigen Zeichencodes. Und daran kann natürlich auch ein Cast nichts ändern.
-
theliquidwave schrieb:
Hi.
Das geht schlecht da ich noch ein paar mehr char's habe und diese nicht als unsigned möchte.
Die Datei die ich parse wird mittels Funktionen von VALVe ausgelesen (Spielehersteller) und dieser Parser liefert nur const char's zurück.Gruß und Danke.
du kannst signed davor schreiben.
-
@ 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];