Convertir une chaine char* en hexa en entier [Résolu]

Convertir une chaine char* en hexa en entier [Résolu] - C++ - Programmation

Marsh Posté le 14-05-2003 à 23:17:57    

Voilà le problème. Je récupère le résultat d'un hachage MD5 qui se présente comme ceci : "d41d8cd98f00b204e9800998ecf8427e"
 
il me faudrait convertir ce nombre en exa (qui est contenue dans un char*) en valeur entière


Message édité par jagstang le 15-05-2003 à 17:17:05
Reply

Marsh Posté le 14-05-2003 à 23:17:57   

Reply

Marsh Posté le 14-05-2003 à 23:26:08    

"ce nombre en exa en valeur entier"
 
euh lequel ?

Reply

Marsh Posté le 14-05-2003 à 23:28:10    

JagStang a écrit :

Voilà le problème. Je récupère le résultat d'un hachage MD5 qui se présente comme ceci : "d41d8cd98f00b204e9800998ecf8427e"
 
il me faudrait convertir ce nombre en exa (qui est contenue dans un char*) en valeur entière
 
 


 
en gros :
 

Code :
  1. int resultat=0; /* là ou il y a le resultat */
  2. char* hachage; /* ta chaine qui contient le hash */
  3. for(i=str_len(hachage)-1;i<=0;i++)
  4. {
  5.   switch (hachage[i])
  6.   {
  7.     case '0' : break;
  8.     case '1' : resultat=resultat+(16^i); break;
  9.     case '2' : resultat=resultat+(16^i)*2; break;
  10.     ...
  11.   }
  12. }


c'est sortie en live

Reply

Marsh Posté le 14-05-2003 à 23:38:41    

oui. mais ma chaine fait 32 char. Alors 16^32 ça fait pas mal tout de même

Reply

Marsh Posté le 14-05-2003 à 23:40:27    

bah oui mais c'est correct :lol:

Reply

Marsh Posté le 14-05-2003 à 23:43:11    

si tu veux. au fait c'est i-- et pas i++

Reply

Marsh Posté le 14-05-2003 à 23:45:58    

c'est un changement d'algo en cours de rédaction :o
 
utilise des unsigned long alors  [:proy]

Reply

Marsh Posté le 15-05-2003 à 00:20:50    

xav14 a écrit :

c'est un changement d'algo en cours de rédaction :o
 
utilise des unsigned long alors  [:proy]  


 
ouais c clair, ca va suffire largement un unsigned long...
 
a vue de nez faut 2 DWORD64 (unsigned int64) pour stocker le bordel.
 
une simple struct genre :

Code :
  1. typedef struct s_Hash
  2. {
  3.    DWORD64 hi;
  4.    DWORD64 lo;
  5. } t_Hash;


 
devrait faire l'affaire...
 
edit : apres, a toi de clakezer du c++, tu rajoutes des operateurs a ta struct, genre = et <, qq methodes pour passer de char * vers t_Hash et inversement, et voila.


Message édité par Konar le 15-05-2003 à 00:24:33
Reply

Marsh Posté le 15-05-2003 à 00:37:38    

Konar a écrit :


ouais c clair, ca va suffire largement un unsigned long...


 
Je mets deux MD5 moi dans un long ! Et facile en plus...
Sur n importe quel proc 256 bits...


Message édité par konar_spreme le 15-05-2003 à 00:38:23
Reply

Marsh Posté le 15-05-2003 à 07:24:19    

exa, c'est pas en base 6?

Reply

Marsh Posté le 15-05-2003 à 07:24:19   

Reply

Marsh Posté le 15-05-2003 à 10:32:05    

Hexa c'est en base 16
 
Mais en fait il me faudrait un simple fonction qui me retourne un entier, plutôt qu'un hexa. ça serait bcp plus simple
 
Si qqn connait d'autres fonction de hachage...

Reply

Marsh Posté le 15-05-2003 à 10:48:39    

JagStang a écrit :


il me faudrait convertir ce nombre en exa (qui est contenue dans un char*) en valeur entière


 
j'avais bien compris banane    [:tomtom75]

Reply

Marsh Posté le 15-05-2003 à 11:13:51    

:heink:

Reply

Marsh Posté le 15-05-2003 à 11:58:49    

sscanf(chaine, "%x", nombre); permet de lire un nombre en hexa mais le problème c'est que c'est limité à 32 bits donc il faudra couper la chaine.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 15-05-2003 à 11:59:26    

&

Reply

Marsh Posté le 15-05-2003 à 12:09:52    

JagStang a écrit :

Hexa c'est en base 16
 
Mais en fait il me faudrait un simple fonction qui me retourne un entier, plutôt qu'un hexa. ça serait bcp plus simple
 
Si qqn connait d'autres fonction de hachage...


 
je sens une grosse flemme de ta part sur ce coup la...
 
pas de fonction standard ki fait ca tout seul...
 
en plus, encore une fois, ton hexa codé sur 32 caracteres ne rentre pas dans un int, ou un double, te faut un nb sur 128 bits, ou 2 sur 64 bits, ou 4 sur 32 bits...
 
et on va pas te faire tout le boulot, mais un indice qd meme : tu coupes ta chaine en 2 (ou en 4), et tu mets chaque bout dans un int64 (ou un int). apres, comment tu fais pour mettre chaque bout ds une variable, a toi de voir, un scanf, un for(), etc.

Reply

Marsh Posté le 15-05-2003 à 12:13:14    

Un truc dans ce genre devrait suffire

Code :
  1. int64 msb, lsb;
  2. strncpy(buff, clemd5, 16)
  3. buff[16] = 0;
  4. sscanf(buff, "%I64x", &msb);
  5. sscanf(clemd5+16, "%I64x", &lsb);


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 15-05-2003 à 12:19:01    

buff[16] = 0;
 
inutile
 
 
apres je connais pas ces formats de sscanf, sur ta plateforme, ça doite tre bon

Reply

Marsh Posté le 15-05-2003 à 12:21:10    

++Taz a écrit :

buff[16] = 0;
 
inutile


 
:lol: :lol:  

Citation :


The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string.


 
Quand on connait mal un sujet, on se la ferme  :sarcastic:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 15-05-2003 à 12:25:30    

marde, j'avais pas vu le 'n'
 
et pourkoi ne pas faire tout en un avec snscanf?
 
edit: qui n'existe pas partout, :/


Message édité par Taz le 15-05-2003 à 12:26:04
Reply

Marsh Posté le 15-05-2003 à 13:21:43    

Konar a écrit :


je sens une grosse flemme de ta part sur ce coup la...


 
Merci de ton aide :heink:  
 
J'ai réglé le problème différemment. Je ne rechigne pas devant le travail
 
Merci quand même

Reply

Marsh Posté le 15-05-2003 à 17:16:37    

Voilà la soluce. ça a l'air fonctionner
 

Code :
  1. // le MD5 délivrant une chaine hexa de 32 car (trop long) on ne prendra que les
  2. // 8 dernieres positions
  3. unsigned long hexaToInt(char *s)
  4.     {
  5.     s += 24 ; // on ne va garder que les 32 derniers bits sur 128
  6.     unsigned int len = strlen(s)-1 ;
  7.     unsigned long retour = 0 ;
  8.     for (unsigned i=0 ; i<len ; i++)
  9.         {
  10.         switch(s[i])
  11.             {
  12.             case '0' : break ;
  13.             case '1' : retour += (pow(16,len-i)) ; break ;
  14.             case '2' : retour += (pow(16,len-i)*2) ; break ;
  15.             case '3' : retour += (pow(16,len-i)*3) ; break ;
  16.             case '4' : retour += (pow(16,len-i)*4) ; break ;
  17.             case '5' : retour += (pow(16,len-i)*5) ; break ;
  18.             case '6' : retour += (pow(16,len-i)*5) ; break ;
  19.             case '7' : retour += (pow(16,len-i)*7) ; break ;
  20.             case '8' : retour += (pow(16,len-i)*8) ; break ;
  21.             case '9' : retour += (pow(16,len-i)*9) ; break ;
  22.             case 'a' : retour += (pow(16,len-i)*10) ; break ;
  23.             case 'b' : retour += (pow(16,len-i)*11) ; break ;
  24.             case 'c' : retour += (pow(16,len-i)*12) ; break ;
  25.             case 'd' : retour += (pow(16,len-i)*13) ; break ;
  26.             case 'e' : retour += (pow(16,len-i)*14) ; break ;
  27.             case 'f' : retour += (pow(16,len-i)*15) ; break ;
  28.             }
  29.         }
  30.     return retour ;
  31.     }


 

Reply

Marsh Posté le 15-05-2003 à 17:21:37    

super efficace ton truc mec.... pourquoi tu aime pas sscanf?

Reply

Marsh Posté le 15-05-2003 à 17:32:37    

merci  :)  
 
Ben je te dirais honnêtement que je maitrise pas trop les printf scanf et autres...  
 
J'ai commencé à faire du peusdo C en cours en utilisant cin cout...
 
C'est pas très puriste je l'admets. Mais bon on apprend comme ça...

Reply

Marsh Posté le 15-05-2003 à 17:38:02    

Non mais en fait c'est plus que bourrin cette fonction... mais bon. ça me suffit pour le moment

Reply

Marsh Posté le 15-05-2003 à 17:43:58    

ben t'as l'occasion d'apprendre la

Reply

Marsh Posté le 15-05-2003 à 18:25:34    

++Taz a écrit :

super efficace ton truc mec.... pourquoi tu aime pas sscanf?


 
Paske calculer des puissances c'est pas long... c'est bcp mieux...
De toute facon les gens veulent mettre un MD5 ds un long, donc, ils ont un proc 128 bits...  
Alors fo bien l'utiliser la puissance de calcul...

Reply

Marsh Posté le 16-05-2003 à 19:09:07    

Tu a pas pense au << c'est beaucoup plus efficase ;)
BW *t élément du nombre multiprecison (tableau)(long)
     UB8 *c buffer a transformé
     int lc taille du buffer
 

Code :
  1. int CharToMulti (BW *t, UB8 *c, int lc) {
  2. int i, j;
  3. for (i = 0, j = 0; ; j++) {
  4.  t[j] = 0;
  5.  t[j] = c[i++];
  6.  if(i >= lc) break;
  7.  t[j] |= c[i++]<<8;
  8.  if(i >= lc) break;
  9.  t[j] |= c[i++]<<16;
  10.  if(i >= lc) break;
  11.  t[j] |= c[i++]<<24;
  12.  if(i >= lc) break;
  13. }
  14. return j;
  15. }


C'est une fonction que j'avais ecrit pour convertir une chaine MD5 en nombre multi-precision
ca peut te donner des idées
Pour le MD5 tu fait un tableau de 8 => 256 bit
Sinon tu fait quoi avec le MD5 ???


Message édité par Mordock le 16-05-2003 à 19:10:37
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed