2016-12-18 1 views
2

Tout en apprenant quelques notions de base avec OpenSSL je suis tombé sur le code à create an SHA256 hash:setw et setfill comme il est utilisé dans une fonction de hachage SHA256

using namespace std; 

    #include <openssl/sha.h> 
    string sha256(const string str) 
    { 
     unsigned char hash[SHA256_DIGEST_LENGTH]; 
     SHA256_CTX sha256; 
     SHA256_Init(&sha256); 
     SHA256_Update(&sha256, str.c_str(), str.size()); 
     SHA256_Final(hash, &sha256); 
     stringstream ss; 
     for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) 
     { 
      ss << hex << setw(2) << setfill('0') << (int)hash[i]; 
     } 
     return ss.str(); 
    } 

Quelqu'un peut-il s'il vous plaît expliquer cess << hex << setw(2) << setfill('0') << (int)hash[i]; fait dans cet exemple spécifique comme simplement possible, tout en l'expliquant efficacement?

Comme je ne peux pas sembler logique de ces réponses, ils ne nous aident pas à comprendre mon extrait spécifique:

+0

Savez-vous ce que chacun des [manipulateurs] (http://en.cppreference.com/w/cpp/io/manip) font d'eux-mêmes? Avez-vous essayé d'expérimenter avec eux lors de l'impression de 'std :: cout'? –

+0

Ensuite, vous devriez probablement [trouver un bon livre pour débutants] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) car il devrait expliquer ces * manipulateurs * et ce qu'ils faire. Vous pouvez aussi faire la sortie 'cout' au lieu de' ss' et voir ce que vous obtenez. Et le plus important, expérimenter! :) –

+1

@Someprogrammerdude Je ne sais pas, je sais presque rien sur std :: quoi que ce soit car je suis en train de passer en C++ de C, et j'ai du mal à tout apprendre à la fois et donner un sens aux docs – Semaphore

Répondre

3

En C++ il y a beaucoup de différents flux . Vous savez probablement sur cout pour écrire la sortie à la console, et cin pour lire l'entrée. stringstream est une classe dont l'objet écrit et lit des objets string. L'écriture dans un flux de chaînes (comme la variable ss) est similaire à l'écriture sur cout, mais écrit dans une chaîne à la place de la console.

Vous dites que vous avez programmé C? Alors vous devriez savoir sur la notation hexadécimale, non? C'est ce que the hex manipulator dit le flux à utiliser. Ceci est similaire au spécificateur de format printf"%x".

The setw manipulator définit la largeur de champ de la sortie suivante.

The setfill manipulator définit le remplissage caractère de la sortie.

Enfin, la coulée de hash[i] à int est parce que hash[i] est un char et la sortie à un flux écrirai comme un caractère et non un petit nombre entier.

En bref,

ss << hex << setw(2) << setfill('0') << (int)hash[i]; 

est équivalent au code C

sprintf(temporaryBuffer, "%02x", hash[i]); 
strcat(ss, temporaryBuffer); 
+0

Fait très bien comprendre l'ensemble du problème! – Semaphore