我是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);
}
答案 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);