Копировать шестнадцатеричные значения с помощью sprintf в C

#c #printf

#c #printf

Вопрос:

Из приведенного ниже кода я пытаюсь преобразовать результат из result var в string var, но пока безуспешно. Что не так? Почему я не могу получить правильный результат? Если я напечатаю это напрямую, все будет в порядке…

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

char *string = "stelios";
unsigned char s[MD5_DIGEST_LENGTH];
int main()
{
 int i;
 unsigned char result[MD5_DIGEST_LENGTH];

  MD5(string, strlen(string), result);

  // output
  for(i = 0; i < MD5_DIGEST_LENGTH; i  ){
   sprintf(s,"%0x", result[i]);//
   printf("%x",s[i]);
  }
   printf("n%x",s);

   return EXIT_SUCCESS;
  }
  

Комментарии:

1. Какую ошибку вы видите? Похоже, ваш строковый буфер просто недостаточно велик.

Ответ №1:

Попробуйте это:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

char *string = "stelios";
char s[MD5_DIGEST_LENGTH * 2   1] = "";
int main()
{
  int i;
  unsigned char result[MD5_DIGEST_LENGTH];

  MD5(string, strlen(string), result);

  // output
  for(i = 0; i < MD5_DIGEST_LENGTH; i  ){
    char temp[3];
    sprintf(temp, "x", result[i]);
    strcat(s, temp);
  }
  printf("Final Hex String: %s",s);

  return EXIT_SUCCESS;
}
  

Ответ №2:

При каждом sprintf вызове он записывает форматированное значение в начало s , перезаписывая все, что было написано там в предыдущем вызове. Вам нужно сделать что-то вроде sprintf(s i*2, "x", result[i]); (и изменить длину s на 2*MD5_DIGEST_LENGTH 1 ).

Ответ №3:

Вот что я использовал:

   char *digit="0123456789abcdef";
  char hex[2*MD5_DIGEST_LENGTH 1],*h;
  int i;
  for (h=hex,i=0; i<N; i  )
  {
   *h  =digit[digest[i] >> 4];
   *h  =digit[digest[i] amp; 0x0F];
  }
  *h='';