将值捕获到字符串中时出现问题
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
。
我是 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
。