2010-10-20 109 views
3

在std :: string的()方法中使用時出現奇怪的問題。我想使用這個庫來計算給定字符串的md5散列值:http://sourceforge.net/projects/libmd5-rfc/files/ 散列值的計算是正確的,但是打印它的方式存在問題。輸出是:爲什麼我的MD5值用額外的「f」字符打印?

af04084897ebbf299b04082d105ab724 
ffffffaf040848ffffff97ffffffebffffffbf29ffffff9b04082d105affffffb724 

代碼是:

#include <stdio.h> 
    #include<string> 
    #include<iostream> 

    extern "C" { 
     #include "md5.h" 
    } 

    int main() 
    { 
     md5_state_t state; 
     md5_byte_t digest[16]; 

     std::string callid("[email protected]"); 

     md5_init(&state); 
     md5_append(&state, (const md5_byte_t*)callid.c_str(), callid.length()); 

     std::string callid_digest((const char*)digest, 16); 

     for(int i = 0; i < 16; ++i) { 
      printf("%02x", digest[i]); 
     } 

     printf("\n"); 

     for(int i = 0; i < 16; ++i) { 
      const char c = callid_digest.at(i); 
      printf("%02x", c); 
     } 

     printf("\n"); 
    } 

在哪裏的 「F」 字從何而來?

+0

pejotr,我超買的代碼,因爲它被認爲是更好的問題是自我包含的越好。我也改變了標題,使其更能表明問題。希望你不介意。乾杯。 – paxdiablo 2010-10-20 18:12:03

回答

8

您的字節值正在被符號擴展。

也就是說,當你推動(簽字)字符更廣泛的類型和最高位恰好設置,因爲它試圖保護標誌(這就是爲什麼你看到的額外f字符只爲大於0x7f值)。使用unsigned char應該解決的問題:

const unsigned char c = callid_digest.at(i); // may need to cast. 
+1

或者更好,使用'unsigned char'的'md5_byte_t'。 – Potatoswatter 2010-10-20 18:04:18

+1

或使用std :: cout,以便自動檢測類型。 – 2010-10-20 18:19:29

相關問題