将值捕获到字符串

时间:2015-11-01 21:54:56

标签: c arrays string printf md5

我是c的新手,我知道我做错了什么,但我真的可以在这里使用一些帮助。

我正在尝试获取一个字符串并获取它的MD5校验和哈希值。我有很好的计算MD5的工作代码(下面)。它们运作良好,我对它们没有任何问题。我的问题是将此函数的输出捕获到字符串中。我知道这很简单,但我不确定我搞砸了什么:

// MD5 Hash query_string for return checksum
int i;
unsigned char result[MD5_DIGEST_LENGTH];
unsigned char returnCheck;

MD5(query_string, strlen(query_string), result);

// output
for(i = 0; i < MD5_DIGEST_LENGTH; i++)
    {
    printf("MD return   = %02x\n", result[i]);
    returnCheck += result[i];
    printf("returnCheck = %02x\n",returnCheck);
    }

正如您所看到的,我正在尝试获取result [i]的输出并将其连接成单个字符串(returnCheck)。问题是我没有在returnCheck中获得正确的值。见下面的输出:

MD return   = 6b
returnCheck = 6b
MD return   = 84
returnCheck = ef
MD return   = 12
returnCheck = 01
MD return   = a6
returnCheck = a7
MD return   = a9
returnCheck = 50
MD return   = 96
returnCheck = e6
MD return   = 98
returnCheck = 7e
MD return   = 52
returnCheck = d0
MD return   = 3b
returnCheck = 0b
MD return   = d6
returnCheck = e1
MD return   = 32
returnCheck = 13
MD return   = 77
returnCheck = 8a
MD return   = 0c
returnCheck = 96
MD return   = b4
returnCheck = 4a
MD return   = 3d
returnCheck = 87
MD return   = 4f
returnCheck = d6

我应该在这个例子中得到的MD5是&#39; 6b8412a6a99698523bd632770cb43d4f&#39; MD返回正确显示,但不返回checkCheck。目标是在这个函数的末尾有一个名为&#39; returnCheck&#39;的字符串。值为&#39; 6b8412a6a99698523bd632770cb43d4f&#39;。

请帮忙!

- 我也试过了 -

// MD5 Hash query_string for return checksum
int i;
unsigned char result[MD5_DIGEST_LENGTH];
char returnCheck[32] = "";

MD5(query_string, strlen(query_string), result);

// output
for(i = 0; i < MD5_DIGEST_LENGTH; i++)
    {
    printf("MD return   = %02x\n", result[i]);
    returnCheck[i] = result[i];
    printf("returnCheck = %x\n",returnCheck);
    }

2 个答案:

答案 0 :(得分:3)

逐步使用sprintf()snprintf()即可,但不需要中间缓冲区:

unsigned char result[MD5_DIGEST_LENGTH];
char returnCheck[2 * MD5_DIGEST_LENGTH + 1] = "";
size_t offset = 0;

MD5(query_string, strlen(query_string), result);

for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
    offset += sprintf(&returnCheck[offset], "%02x", result[i]);
assert(offset < sizeof(returnCheck));
printf("%s\n", returnCheck);

或者,使用snprintf()

for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
    offset += snprintf(&returnCheck[offset], sizeof(returnCheck) - 2 * i, "%02x", result[i]);

通常,最好使用snprintf()。在这里,你知道尺寸是可以的,所以没有真正的好处。

如果这是在函数体内,请不要尝试返回returnCheck

这是用C99编写的;如果您的编译器不喜欢for (int i = 0; …)表示法,请将其设置为接受C99或C11,或者获得更好的编译器,或者在块的开头处在循环外声明int i并省略int循环中的for

答案 1 :(得分:1)

sprintf每个结果[i]到一个中间数组和strcat到returnCheck

int i;
unsigned char result[MD5_DIGEST_LENGTH];
char returnCheck[34] = "";
char hex[3] = "";

MD5(query_string, strlen(query_string), result);

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