2015-11-01 58 views
-1

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

正如你可以看到,我试图把结果输出[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回报显示正确,但不returnCheck。目标是在这个函数的最后有一个名为'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); 
    } 
+3

'returnCheck'是一个单独的字符,而不是一个字符串。 '+ ='操作不是串联;它是算术。所以,你需要一个字符数组,你需要担心空终止。 –

+0

@JonathanLeffler我试过了(请参阅上面的代码更改)仍然不起作用?我在搞什么? –

+1

@StevenCarlson在您编辑的版本中,当您打印出'returnCheck'的值时,您没有使用索引'[i]'。 –

回答

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); 
+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,并省略for循环中的int

+0

乔纳森,谢谢! –