将值捕获到字符串中时出现问题

Problems capturing value into string

我是 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 是“6b8412a6a99698523bd632770cb43d4f”,MD return 显示正确,但未 return 检查。目标是在这个函数的末尾有一个名为 'returnCheck' 的字符串,其值为 '6b8412a6a99698523bd632770cb43d4f'.

请帮忙!

-- 我也试过了--

// 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);
    }

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);

增量使用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()。在这里,您知道尺寸还可以,所以没有真正的好处。

如果这是在函数体中,请不要尝试 return returnCheck

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