2015-11-01 53 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

喬納森,謝謝! –