2010-10-20 5 views
3

У меня странная проблема при использовании метода()() метода std :: string. Я хотел бы вычислить хэш хед для данной строки, используя эту библиотеку: 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

ответ

8

Значения вашего байта расширяются по знаку.

Это происходит, если вы продвигаете символ (подписанный) на более широкий тип и устанавливаете верхний бит, потому что он пытается сохранить знак (именно поэтому вы видите дополнительные символы f только для значений, превышающих 0x7f). Использование unsigned char должны исправить эту проблему:

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

Или лучше, используйте 'md5_byte_t', который является' unsigned char'. – Potatoswatter

+1

или используйте std :: cout, чтобы тип был автоматически обнаружен. –

Смежные вопросы