MDPrint() - void zu char *
-
Hallo,
Ich habe einen Code, der einen MD5 Hash berechnet.
Folgende Prozedur wandelt den Hash in normale Hex Schreibweise um und schreibt ihn auf die Console.Ich würde nun gerne, dass er ihn nicht einfach auf die Console schreibt, sondern ihn als char* als Rückgabewert zurückliefert.
static void MDPrint (MD5_CTX *mdContext) { int i; for (i = 0; i < 16; i++) printf ("%02x", mdContext->digest[i]); }
Ich denke es müsste mit sprintf() funktionieren, aber alle meine versuche, haben entweder ne AV oder ein falschen Ergebnis geliefert.
Kann mir jemand helfen?
Vielen Dank schonmal.
-
Achja, ich benutze Microsoft Visual Studio 2008.
-
müsste ungefähr so gehen:
static void MD5_to_hex (MD5_CTX *mdContext, char *string) { int i; for (i = 0; i < 16; i++) string += sprintf (string, "%02x", mdContext->digest[i]); }
(ungetestet)
-
~fricky schrieb:
müsste ungefähr so gehen:
static void MD5_to_hex (MD5_CTX *mdContext, char *string) { int i; for (i = 0; i < 16; i++) string += sprintf (string, "%02x", mdContext->digest[i]); }
(ungetestet)
Vielen Dank, das funktioniert.
Nur leider zieht diese Prozedur die Performance meiner Anwendung ziemlich runter.
Ich glaube es liegt an dem wiederholenden +=Gibt es auch ne Möglichkeit das ganze performanter zu machen, also auf das += zu verzichten und direkt in ein char[33] zu kopieren?
Wäre super, wenn das noch jemand schafft. Danke!
-
tgk schrieb:
Ich glaube es liegt an dem wiederholenden +=
ich glaub' eher an den 'sprintfs'
aber versuch's statt mit sprintf mal damit:void to_hex_string (char *in, char *out) { static char *hex = "0123456789abcdef"; while (*in) { char c = *in++; *out++ = hex[c>>4 & 15]; *out++ = hex[c & 15]; } *out = 0; }
-
~fricky schrieb:
tgk schrieb:
Ich glaube es liegt an dem wiederholenden +=
ich glaub' eher an den 'sprintfs'
aber versuch's statt mit sprintf mal damit:void to_hex_string (char *in, char *out) { static char *hex = "0123456789abcdef"; while (*in) { char c = *in++; *out++ = hex[c>>4 & 15]; *out++ = hex[c & 15]; } *out = 0; }
Danke, aber ich bin glaub ich einfach zu blöd.
Wie soll ich das aufrufen?typedef struct { UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ UINT4 buf[4]; /* scratch buffer */ unsigned char in[64]; /* input buffer */ unsigned char digest[16]; /* actual digest after MD5Final call */ } MD5_CTX;
Habs so versucht, aber dann gibts leider ne Exception:
char hash[33]; to_hex_string((char*)mdContext.digest,hash);
-
ach so, ääääh die funktion^^ ist für strings. für char-arrays musste sie umbauen:
void to_hex_string (unsigned char *in, int len, char *out) { static char *hex = "0123456789abcdef"; int s; for (s=0; s<len; s++) { *out++ = hex[in[s]>>4]; *out++ = hex[in[s]&15]; } *out = 0; }
und dann:
MD5_CTX ctx; char txt[33]; ... to_hex_string (ctx.digest, sizeof (ctx.digest), txt);
-
~fricky schrieb:
ach so, ääääh die funktion^^ ist für strings. für char-arrays musste sie umbauen:
void to_hex_string (unsigned char *in, int len, char *out) { static char *hex = "0123456789abcdef"; int s; for (s=0; s<len; s++) { *out++ = hex[in[s]>>4]; *out++ = hex[in[s]&15]; } *out = 0; }
und dann:
MD5_CTX ctx; char txt[33]; ... to_hex_string (ctx.digest, sizeof (ctx.digest), txt);
Okay, so funktioniert es
und ist wirklich sehr schnell
Danke nochmal.
erledigt