2010-10-20 34 views
3

J'ai un problème étrange lors de l'utilisation de la méthode at() de std :: string. Je voudrais calculer md5 hash pour une chaîne donnée en utilisant cette bibliothèque: http://sourceforge.net/projects/libmd5-rfc/files/ Hash est calculé correctement, mais il y a un problème avec l'impression de façon humaine. La sortie est:Pourquoi ma valeur MD5 est-elle imprimée avec des caractères "f" supplémentaires?

af04084897ebbf299b04082d105ab724 
ffffffaf040848ffffff97ffffffebffffffbf29ffffff9b04082d105affffffb724 
code

est:

#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"); 
    } 

D'où viennent les caractères "f" vient?

+0

pejotr, je l'ai acheté le code sur, car il est considéré comme mieux pour les questions soient aussi autonome que possible. J'ai également changé le titre pour le rendre plus indicatif du problème. J'espère que ça ne vous dérange pas. À votre santé. – paxdiablo

Répondre

8

Vos valeurs d'octets sont en cours d'extension. Cela se produit lorsque vous promouvez le caractère (signé) à un type plus large et que le bit supérieur est défini, car il essaie de préserver le signe (c'est pourquoi vous voyez les caractères f supplémentaires uniquement pour les valeurs supérieures à 0x7f). L'utilisation d'un unsigned char devrait résoudre le problème:

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

Ou mieux, utilisez 'md5_byte_t' qui est' unsigned char'. – Potatoswatter

+1

ou utilisez std :: cout pour que le type soit automatiquement détecté. –