2011-10-02 4 views
0

Je ne suis pas sûr de savoir si je traduis ou convertis correctement un unsigned char* en un signed char* normal? Le unsigned char* est une chaîne qui a été hachée. Le code suivant convertit-il correctement un unsigned char* en signed char*?L'affichage d'un char * non signé et d'un char signé * doit-il afficher exactement le même résultat?

std::string message = "to be encrypted"; 
unsigned char hashMessage[SHA256_DIGEST_SIZE]; 

SHA256::getInstance()->digest(message, hashMessage); 

// is this conversion correct 
char* hashMessageSigned = reinterpret_cast<char*>(hashMessage); 
printf("Unsigned Char Hash: %s\n", hashMessageSigned); // The 2 printf's print out exactly the same strings is that correct? 
printf("Signed Char Hash: %s\n", hashMessage); 
+1

Que fait la documentation de la bibliothèque que vous utilisez dire digest()? (il renvoie probablement une représentation binaire de la valeur de hachage, vous devez la convertir en quelque chose d'imprimable, par exemple une chaîne hexadécimale, avant de l'imprimer) – nos

+0

et quelle est exactement la partie C de votre question? – wildplasser

+0

Il est noté "régulier" à propos du caractère signé. Les types 'char',' signed char' et 'unsigned char' sont trois types différents, distinctifs et indépendants. Le type 'char' n'est pas nécessairement signé. – AnT

Répondre

4

Vous ne convertissez rien ici. Les deux printf ont pour instruction de traiter les données comme des chaînes imprimables.

Signé ou non signé est une question d'interprétation. 0xFF peut être 255 ou -1, selon la façon dont vous interprétez cela. Le "signe" du type est l'instruction qui aide le compilateur à interpréter les données.

Mais dans ce cas vous ne traitez pas les données comme des nombres, vous les traitez comme des chaînes, et l'interprétation est totalement différente: 0xFF est le caractère à l'endroit 255 de la table ASCII. Il n'y a aucun signe là. Pour être sûr que vous l'avez obtenu: reinterpret_cast<char*> ne convertit pas les données, il convertit la façon dont le compilateur traite le pointeur. Le %s indique comment le printf devrait traiter le pointeur, et n'a aucun rapport avec ce que le compilateur a été chargé de faire auparavant (et est fait pendant l'exécution).

+0

Il n'y a pas de caractère ASCII à la position 255. –

+0

@KerrekSB - donc l'espace vide sera imprimé, d'où mon point. – littleadv

Questions connexes