Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2193 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°394475
jagstang
Pa Capona ಠ_ಠ
Posté le 14-05-2003 à 23:17:57  profilanswer
 

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
mood
Publicité
Posté le 14-05-2003 à 23:17:57  profilanswer
 

n°394493
VisualC++
J'va y penser ...
Posté le 14-05-2003 à 23:26:08  profilanswer
 

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

n°394498
xav14
Posté le 14-05-2003 à 23:28:10  profilanswer
 

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

n°394507
jagstang
Pa Capona ಠ_ಠ
Posté le 14-05-2003 à 23:38:41  profilanswer
 

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

n°394510
philou_a7
\_o&lt; coin ! &gt;o_/
Posté le 14-05-2003 à 23:40:27  profilanswer
 

bah oui mais c'est correct :lol:

n°394516
jagstang
Pa Capona ಠ_ಠ
Posté le 14-05-2003 à 23:43:11  profilanswer
 

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

n°394520
xav14
Posté le 14-05-2003 à 23:45:58  profilanswer
 

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

n°394536
Konar
Posté le 15-05-2003 à 00:20:50  profilanswer
 

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
n°394544
konar_spre​me
Posté le 15-05-2003 à 00:37:38  profilanswer
 

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
n°394580
Taz
bisounours-codeur
Posté le 15-05-2003 à 07:24:19  profilanswer
 

exa, c'est pas en base 6?

mood
Publicité
Posté le 15-05-2003 à 07:24:19  profilanswer
 

n°394691
jagstang
Pa Capona ಠ_ಠ
Posté le 15-05-2003 à 10:32:05  profilanswer
 

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...

n°394733
Taz
bisounours-codeur
Posté le 15-05-2003 à 10:48:39  profilanswer
 

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]

n°394777
jagstang
Pa Capona ಠ_ಠ
Posté le 15-05-2003 à 11:13:51  profilanswer
 

:heink:

n°394847
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 15-05-2003 à 11:58:49  profilanswer
 

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
n°394848
Taz
bisounours-codeur
Posté le 15-05-2003 à 11:59:26  profilanswer
 

&

n°394878
Konar
Posté le 15-05-2003 à 12:09:52  profilanswer
 

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.

n°394882
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 15-05-2003 à 12:13:14  profilanswer
 

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
n°394894
Taz
bisounours-codeur
Posté le 15-05-2003 à 12:19:01  profilanswer
 

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

n°394896
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 15-05-2003 à 12:21:10  profilanswer
 

++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
n°394898
Taz
bisounours-codeur
Posté le 15-05-2003 à 12:25:30  profilanswer
 

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
n°394955
jagstang
Pa Capona ಠ_ಠ
Posté le 15-05-2003 à 13:21:43  profilanswer
 

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

n°395600
jagstang
Pa Capona ಠ_ಠ
Posté le 15-05-2003 à 17:16:37  profilanswer
 

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.     }


 

n°395608
Taz
bisounours-codeur
Posté le 15-05-2003 à 17:21:37  profilanswer
 

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

n°395632
jagstang
Pa Capona ಠ_ಠ
Posté le 15-05-2003 à 17:32:37  profilanswer
 

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...

n°395647
jagstang
Pa Capona ಠ_ಠ
Posté le 15-05-2003 à 17:38:02  profilanswer
 

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

n°395767
Taz
bisounours-codeur
Posté le 15-05-2003 à 17:43:58  profilanswer
 

ben t'as l'occasion d'apprendre la

n°395790
konar_spre​me
Posté le 15-05-2003 à 18:25:34  profilanswer
 

++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...

n°397442
Mordock
Posté le 16-05-2003 à 19:09:07  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Comment recuperer la chaine de char de response.sendError[javascript] Changer un attribut d'un css sur une autre frame? RESOLU
Bizarrerie de l'editeur hexaConvertir un float en string en C++
extraire un chiffre d'une chaineRécupérer les éléments d'une chaine
Imprimer une partie d une chaine de caracteres[ActionScript] Pb de chaine de caracteres
[ASP] fonction suppr espace fin de chaine[MFC] Utiliser les SpinButtonCtrl [résolu, solution inside]
Plus de sujets relatifs à : Convertir une chaine char* en hexa en entier [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR