使用sp中的sprintf复制十六进制值

时间:2011-05-13 22:21:55

标签: c printf

从下面的代码中我试图将结果var的结果变为字符串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;
  }

3 个答案:

答案 0 :(得分:2)

试试这个:

#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, "%02x", result[i]);
    strcat(s, temp);
  }
  printf("Final Hex String: %s",s);

  return EXIT_SUCCESS;
}

答案 1 :(得分:2)

每次调用sprintf时,它都会将格式化的值写入s开头,覆盖前一次调用中写入的内容。您需要执行sprintf(s + i*2, "%02x", result[i]);之类的操作(并将s的长度更改为2*MD5_DIGEST_LENGTH+1)。

答案 2 :(得分:0)

这是我用过的东西:

  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] & 0x0F];
  }
  *h='\0';