Byte* zu Hexstring
-
Hallo Leute,
Ich hoffe ihr könnt mir helfen, Ich habe echt keine Ahnung mehr was ich machen soll, ich hab schon viel rumgegogglet aber so wirklich gute lösungen konnte ich leider nicht finden. Das problem liegt viel mehr darin das ich für eine Konsole entwickle (PS3) und versuche vergebens meinen MD5 Hash aus dem Memory in einen Hexstring zu formatieren.
Das problem an der sache ist, das die Konsole sehr eingeschränkt ist was Libs angeht, ich kann natürlich standardfunctions with strlen, printf, va usw benutzen aber leider keine std libs (std::string/sstream usw).
Daher muss ich das ganze in einen char* hinbekommen. Der MD5 Hash array ist 16 bytes groß.Ich hoffe jemand hat hier gute Lösungen parat.
Lg
Sebastian
-
Wo liegt das Problem, das einfach selber coden?
-
selbercoden? schrieb:
Wo liegt das Problem, das einfach selber coden?
Naja das problem liegt eher daran das ich lösungen aus dem netz nicht wirklich nutzen kann durch die einschränkung der libs.
ich hab leider keine ahnung wie ich es selbst machen würde da ich es nie gemacht habe, ich hatte davor QT, das hatte auch alles funktionen die ich brauchte meistens.Lg
-
[quote="seb5594"]
selbercoden? schrieb:
ich hab leider keine ahnung wie ich es selbst machen würde
Nunja, ein Hex-Zeichen geht von 0 bis F, dezimal wären das 0 bis 15, das sind genau 4 Bits. Du musst dir also nur byte für byte einzeln vornehmen und zwei Hex-Zeichen draus machen, jeweils aus den ersten 4 und den letzten 4 Bits.
-
[quote="tkausl"]
seb5594 schrieb:
selbercoden? schrieb:
ich hab leider keine ahnung wie ich es selbst machen würde
Nunja, ein Hex-Zeichen geht von 0 bis F, dezimal wären das 0 bis 15, das sind genau 4 Bits. Du musst dir also nur byte für byte einzeln vornehmen und zwei Hex-Zeichen draus machen, jeweils aus den ersten 4 und den letzten 4 Bits.
Das ganze hab ich schon versucht. Nur leider kann man nicht 2 chars in einem machen.
strcat hat einen fehler ausgelöst.
So sieht meine derzeitige funktion ausconst char* hexString(unsigned char *bytes, int bytesLength) { char lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char s[32]; for (int i = 0; i < bytesLength; i++) { strcat(s, (char*)lookup[bytes[i] >> 4]); strcat(s, (char*)lookup[bytes[i] & 0xF]); } return s; }
-
const char* hexString(unsigned char *bytes, int bytesLength) { char lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char *s = malloc(sizeof(char) * (bytesLength * 2 + 1)); for (int i = 0; i < bytesLength; i++) { s[i*2] = lookup[(bytes[i] >> 4) & 0xF]; s[i * 2 + 1] = lookup[bytes[i] & 0xF]; } s[bytesLength * 2] = 0; return s; }So in etwa.
-
Leider hat es nicht das gewünschten ergebnis gebracht.
Der byte array ist folgender:
0E DA AE D9 F4 80 EA 0C BF 80 D2 C7 EB 2D 88 69Als ausgabe hab ich dies erhalten: � >X
Das gewünschte ergebnis ist aber
"0EDAAED9F480EA0CBF80D2C7EB2D8869" als char*.Das script sieht aktuell so aus
const char* hexString(unsigned char *bytes, int bytesLength) { char lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char s[33]; //length 16 * 2 + 1 = 33. fixed size da es eine konstante benötigt hat. for (int i = 0; i < bytesLength; i++) { s[i * 2] = lookup[bytes[i] >> 4]; s[i * 2 + 1] = lookup[bytes[i] & 0xF]; } return s; }
-
Achtung, du gibst da einen Zeiger auf ein lokales Array zurück. Nimm entweder malloc oder überlass die Bufferverwaltung dem Aufrufer.
void hexString(unsigned char *bytes, int bytesLength, char *dest) { char lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; for (int i = 0; i < bytesLength; i++) { dest[2*i ] = lookup[(bytes[i]>>4)&0xF]; dest[2*i+1] = lookup[bytes[i] & 0xF]; } dest[2*bytesLength] = 0; }
-
seb5594 schrieb:
Das problem an der sache ist, das die Konsole sehr eingeschränkt ist was Libs angeht, ich kann natürlich standardfunctions with strlen, printf, va usw benutzen aber leider keine std libs (std::string/sstream usw).
Das ist eine SEHR ungewöhnliche Einschränkung. Bist du sicher, dass du kein C machst? Kennt die Umgebung keine dynamische Speicherverwaltung?
-
selbercoden? schrieb:
Achtung, du gibst da einen Zeiger auf ein lokales Array zurück. Nimm entweder malloc oder überlass die Bufferverwaltung dem Aufrufer.
void hexString(unsigned char *bytes, int bytesLength, char *dest) { char lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; for (int i = 0; i < bytesLength; i++) { dest[2*i ] = lookup[(bytes[i]>>4)&0xF]; dest[2*i+1] = lookup[bytes[i] & 0xF]; } dest[2*bytesLength] = 0; }Vielen dank dir!
Habe fast das erwartete ergebnisHash: 0EDAAED9F480EA0CBF80D2C7EB2D8869� >X
Eigentlich sollte es nur bis zur 69 am ende gehen.
Rufe die funktion so auf. Malloc funkioniert nicht auf meiner Konsole.char temp[33];
hexString(buffer, 0x10, temp);
-
Besser:
void hexString(unsigned char const* bytes, std::size_t bytesLength, char* dest) { static char const lookup[] = "0123456789ABCDEF"; for (std::size_t i = 0; i != bytesLength; ++i) { dest[2*i ] = lookup[ bytes[i] >> 4 ]; dest[2*i+1] = lookup[ bytes[i] & 0xF ]; } }Testprogramm:
int main() { unsigned char const arr[] = {1, 2, 3, 4, 5}; char dest[2*sizeof arr + 1]; hexString(arr, sizeof arr, dest); dest[2*sizeof arr] = 0; std::cout << dest; }Mit erwarteter Ausgabe. Die Nullterminierung sollte dem Aufrufer überlassen werden.
-
SeppJ schrieb:
seb5594 schrieb:
Das problem an der sache ist, das die Konsole sehr eingeschränkt ist was Libs angeht, ich kann natürlich standardfunctions with strlen, printf, va usw benutzen aber leider keine std libs (std::string/sstream usw).
Das ist eine SEHR ungewöhnliche Einschränkung. Bist du sicher, dass du kein C machst? Kennt die Umgebung keine dynamische Speicherverwaltung?
Und ja, sehr sicher. Das Sony SDK hat sehr schlecht detailierte Dokumentationen (teilweise japanisch) und bietet sehr viele Funktionen was die konsole direkt angeht, alles andere ist irgendwie auf der Strecke geblieben, was ich persöhnlich auch sehr merkwürdig finde. Die Konkurrenz (Microsoft) hat dagegen die nase vorne deutlich.
Für die zwecke für die ich es benötige, reicht's eigentlich ausser die kleinen einschränkungen bei einigen dingen.Lg
-
Arcoth schrieb:
Besser:
void hexString(unsigned char const* bytes, std::size_t bytesLength, char* dest) { static char const lookup[] = "0123456789ABCDEF"; for (std::size_t i = 0; i != bytesLength; ++i) { dest[2*i ] = lookup[ bytes[i] >> 4 ]; dest[2*i+1] = lookup[ bytes[i] & 0xF ]; } }Testprogramm:
int main() { unsigned char const arr[] = {1, 2, 3, 4, 5}; char dest[2*sizeof arr + 1]; hexString(arr, sizeof arr, dest); dest[2*sizeof arr] = 0; std::cout << dest; }Mit erwarteter Ausgabe. Die Nullterminierung sollte dem Aufrufer überlassen werden.
Leider bekomme ich immer als ergebnis diesen char
"0EDAAED9F480EA0CBF80D2C7EB2D8869� >X"
-
Du setzt den Nullterminator zu spät.
Schreib mal
temp[32] = 0;hinter den Aufruf.
-
Arcoth schrieb:
Die Nullterminierung sollte dem Aufrufer überlassen werden.
Was für einen Zweck hat das? Premature optimization zu Lasten von Fehleranfälligkeit!?
-
Arcoth schrieb:
Du setzt den Nullterminator zu spät.
Schreib mal
temp[32] = 0;hinter den Aufruf.
Leider nein, so ist mein Funktionsaufruf
char dest[0x21]; hexString(buffer, 0x10, dest); dest[0x20] = 0; return dest;
-
Arcoth schrieb:
Die Nullterminierung sollte dem Aufrufer überlassen werden.
Weil? Ohne Nullterminierung sollte deine Funktion nicht String im Namen haben ...
-
Swordfish schrieb:
Arcoth schrieb:
Die Nullterminierung sollte dem Aufrufer überlassen werden.
Weil? Ohne Nullterminierung sollte deine Funktion nicht String im Namen haben ...
Hab jetzt mal den char array von 0x21 auf 0x20 gemacht und das ist dann das resultut
"0EDAAED9F480EA0C� >XD2C7EB2D8869"
-
selbercoden? schrieb:
Achtung, du gibst da einen Zeiger auf ein lokales Array zurück. Nimm entweder malloc oder überlass die Bufferverwaltung dem Aufrufer.
-
selbercoden? schrieb:
selbercoden? schrieb:
Achtung, du gibst da einen Zeiger auf ein lokales Array zurück. Nimm entweder malloc oder überlass die Bufferverwaltung dem Aufrufer.
Malloc fällt schonmal aus der auswahl durch, wie meinst mit überlassen der bufferverwaltung?
Lg