2013-03-14 3 views
1

Я использую код Md5 C на википедииMD5 Преобразование uint8_t в строку

int main(int argc, char **argv) { 

if (argc < 2) { 
    printf("usage: %s 'string'\n", argv[0]); 
    return 1; 
} 

char *msg = argv[1]; 
size_t len = strlen(msg); 

// benchmark 
int i; 
for (i = 0; i < 1000000; i++) { 
    md5(msg, len); 
} 

//var char digest[16] := h0 append h1 append h2 append h3 //(Output is in little-endian) 
uint8_t *p; 

// display result 

p=(uint8_t *)&h0; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h0); 

p=(uint8_t *)&h1; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h1); 

p=(uint8_t *)&h2; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h2); 

p=(uint8_t *)&h3; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h3); 
puts(""); 

return 0; 

}

Это является code.I уже есть некоторые знания, как это работает, и мне нужно, чтобы преобразовать результат MD5 на строку. Возможно ли это?

В принципе, мне нужно было бы преобразовать p = (uint8_t *) &h0; каждый из них в char [] и, в другом слове, соединить их, имея весь код MD5 в одном знаке []. Это правильно или возможно?

Я потратил весь день на привязи, чтобы найти это, и лучшее, что я получил, - это как преобразовать unit32_t с помощью sprinft, и он действительно работает. но для unit8_t это не так.

ответ

2

Каждое 8-битное число должно быть напечатано %02x.

  • Ведущий 0 означает, что число будет показано с ведущими нулями
  • 2 означает, что ширина составляет два шестнадцатеричных символа
  • В x средства напечатать номер в шестнадцатеричном формате.

Так первый экземпляр будет:

p = (uint8_t *) &h0; 
printf("%02x%02x%02x%02x", p[0], p[1], p[2], p[3]); 
+0

Так что, если я делаю Sprintf (буфер, "% 02x% 02x% 02x% 02x", р), она работает? – Alessandroempire

+0

Да, он должен это сделать. –

+0

Вопрос: насколько большой должен быть буфер, чтобы 8 бит мог его копировать? – Alessandroempire

Смежные вопросы