YOYOMD5 - CALCUL ET AFFICHAGE DE LA CLEF MD5 D'UN FICHIER
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
11 août 2006 à 10:06
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 2010
-
29 déc. 2006 à 22:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 29 déc. 2006 à 22:07
Bonsoir,
[../..] Ca calcule la clé MD5 et ça l'affiche, tout simplement. [../..]
Je pense qu'on peut faire plus simple :-), pas au point de vu de l'algo mais sur la façon de l'utiliser.
Matt...
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 29 déc. 2006 à 21:34
Bonjour Matt67,
pourtant il me semblait que le titre de la source était suffisamment clair.
Ca calcule la clé MD5 et ça l'affiche, tout simplement.
Après si la programmation en API vous dérange un peu à cause du nombre de ligne, j'en suis désolé, mais je n'y peux pas grand chose. Même si bien sûr, il y forcément moyen de réduire la taille de mon code, j'en suis convaincu.
YOYO, @+.
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 29 déc. 2006 à 21:25
Bonsoir,
Je viens de tomber sur ton code et j'étais très intéressé donc hop, je download ton projet et je l'ouvre et que vois-je, moult lignes de codes pour gérer l'interface graphique (fenêtre, bouton, etc...) et un algo récupéré sur le net. A part pour apprendre à faire une interface graphique en Win32, je ne vois pas trop l'interet de ton code...
Je préfère à la limite le code http://www.cppfrance.com/codes/MD5_10868.aspx qui, au moins, n'écrit 350 000 lignes de code pour gérer l'interface, il va droit au but.
Matt...
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 19 août 2006 à 20:41
Je reviens vite fait au problème de départ (strncpy(PIcone.szTip, Tip, strlen(Tip));)
Non seulement c'est plus lent (un strlen inutile), mais en plus c'est faux, car le 0 terminal n'est pas copié
C'était juste pour préciser, je viens de m'en rendre compte
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 13 août 2006 à 13:02
Ok ! Donc je pense avoir tout bien compris sur ce que vous m'avez dit et je dois dire que ça m'a été très utile.
J'espère que ça sera de même pour beaucoup d'autres.
En tous cas merci à tous pour vos explications et éclaircissements.
P.S: je m'attaque à la mise à jour de YoyoMD5.
YOYO, @+.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 13 août 2006 à 12:39
Oui et ce n'est jamais utile de l'utiliser comme ca car
strncpy(PIcone.szTip, Tip, strlen(Tip));
est équivalent (sémantiquement, pas en terme de vitesse) à
strcpy(PIcone.szTip, Tip);
Pour éviter un débordement, il faut faire quelque chose du genre
strncpy(PIcone.szTip, Tip, MAX_SIZE);
ou MAX_SIZE est la taille disponible dans le buffer PIcone.szTip. Ca ne dépend pas de la longueur de Tip
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 13 août 2006 à 12:18
Juste une petite remarque par rapport au premier message de vecchio56.
Le débordement est empêché d'une manière détournée, c'est-à-dire que la chaîne de caractères qui peut être copiée PIcone.szTip fait au maximum 63 de long (0 de fin exclus). Et comme szTip peut contenir au max 64 caractères, c'est nickel.
Cela n'empêche pas que BruNews a raison sur le fait que la version n de strcpy est dans ce cas inutile.
YOYO, @+.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 août 2006 à 19:51
A quand une faq cppfrance ? Ca pourrait alleger le forum vu le nombre de questions récurrentes ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 août 2006 à 19:41
ben oui il faut avoir saisi et bien pour cela qu'il ne faut pas hésiter à répéter ce genre de chose, on voit si souvent l'erreur sur cppfrance.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 août 2006 à 19:36
Oui mais la tab et buf sont des pointeurs, pas des tableaux.
C'est exactement la meme chose si je fais
int tab[10];
int * p = tab;
sizeof tab == 10 * sizeof(int)
et
sizeof p == sizeof(void *)
Dans une fonction on ne peut que recevoir un pointeur contenant l'adresse du tableau, puisqu'il est impossible de passer un tableau à une fonction. Ce n'est pas la faute à sizeof, il faut juste avoir saisie la différence entre un tableau et un pointeur et comment on procède pour passer un tableau à une fonction.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 août 2006 à 19:24
4 à tout coup sur system 32 bits.
Si tableau n'est pas dans la portée du sizeof, on obtient la taille du pointeur selon le systeme mais assurément pas la taille du tableau.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 août 2006 à 18:47
Pourquoi il faut se mefier de sizeof ? Il fait des coup bas ?! sizeof retourne la taille d'un pointeur quand on lui passe un pointeur et quand on lui passe un tableau il retourne la taille d'un tableau, je vois rien d'anormal ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 août 2006 à 11:46
strncpy (ou variante perso) est quasi obligatoire quand tu reçois un param externe ou autres cas de ce genre. Si ton prog ne prend que des chaines dont la longueur est déjà controlée par le biais de la limitation dans un EDIT, ça n'a plus aucun intérêt.
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 11 août 2006 à 11:44
Ok, donc si j'ai bien compris, du moment que l'on assez de mémoire allouée pour faire un strcpy, on a aucun souci?
YOYO, @+.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 11 août 2006 à 11:37
Ben strcpy est très fiable, puisqu'elle fait ce qu'on lui demande. Evidemment faut toujours savoir combien de place il te reste au minimum dans ton buffer. Moi je continue à l'utiliser sans état d'âme
yoyo269
Messages postés1403Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention11 janvier 20092 11 août 2006 à 11:25
Houla déjà tout ça comme remarques ! lol
En plus par la crème de cppfrance.
J'avais déjà lu quelque part que strcpy() n'était pas des plus fiables. Et en plus, je viens de lire que strcat() serait de la même trempe.
Je profite de cette occasion pour vous demandez si tout ceci est vrai ? Si oui, comment avoir une méthode fiable pour les remplacer ?(les pointeurs ?)
Merci Joky pour ton petit bout de code utilisant les pointeurs. Je m'y mets petit à petit, mais je suis encore un peu (voire beaucoup) "handicapé du pointeur" comme dirait BruNews.
Je vais essayer de corriger tout ça au plus vite.
Merci beaucoup pour votre aide.
YOYO, @+.
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 11 août 2006 à 10:45
Ah et il donne la chaine en entier quand il a envie seulement ??? :)
Comment ça se fait qu'elle fait ça cette fonction ?
Et donc oui le *c=0 dans le if... :)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 11 août 2006 à 10:42
Ton *c = 0 peut être mis dans le if, non?
GetCurrentDirectory:
Therefore, the size returned by the function may be two characters less than the size of the specified string, not including the terminating null character
Je sais pas si ca vous est déja arrivé, mais dans ce cas ca marcherait pas
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 août 2006 à 10:42
ah oui il y a aussi le memset 0 suivi du strcat que j'ai oublié de relever, c'est du amuse cpu.
Se méfier de l'utilisation de sizeof, si le pointeur est reçu en param de fonction, sizeof = taille pointeur et rien d'autre. Il vaut mieux se faire un jeu de constantes en rapport à ce qu'on déclare en buffer.
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 11 août 2006 à 10:37
char szCurDir[MAX_PATH];
char *c;
c = szCurDir + GetCurrentDirectory(MAX_PATH, szCurDir);
if(*(c-1) != '\\')
*c++ = '\\';
*c = 0;
Beaucoup plus efficace que des appels à strlen + strcat
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 11 août 2006 à 10:29
On dirait que c'est une manie
http://www.cppfrance.com/infomsg_CONVERTIR-CHAR-CHAR_794339.aspx Ca n'a vraiment aucun intérêt de faire ca
Pour empêcher un débordement de PIcone.szTip, il faut limiter la copie à la taille dispo dans PIcone.szTip et pas à la longueur de Tip
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 août 2006 à 10:06
strncpy(PIcone.szTip, Tip, strlen(Tip));
Quel intérêt d'utiliser la version 'n' par rapport à strcpy si tu n'as pas de controle de longueur ??? Ici tu ne fais que parcourir la chaine 2 fois (strlen) au lieu d'1.
29 déc. 2006 à 22:07
[../..] Ca calcule la clé MD5 et ça l'affiche, tout simplement. [../..]
Je pense qu'on peut faire plus simple :-), pas au point de vu de l'algo mais sur la façon de l'utiliser.
Matt...
29 déc. 2006 à 21:34
pourtant il me semblait que le titre de la source était suffisamment clair.
Ca calcule la clé MD5 et ça l'affiche, tout simplement.
Après si la programmation en API vous dérange un peu à cause du nombre de ligne, j'en suis désolé, mais je n'y peux pas grand chose. Même si bien sûr, il y forcément moyen de réduire la taille de mon code, j'en suis convaincu.
YOYO, @+.
29 déc. 2006 à 21:25
Je viens de tomber sur ton code et j'étais très intéressé donc hop, je download ton projet et je l'ouvre et que vois-je, moult lignes de codes pour gérer l'interface graphique (fenêtre, bouton, etc...) et un algo récupéré sur le net. A part pour apprendre à faire une interface graphique en Win32, je ne vois pas trop l'interet de ton code...
Je préfère à la limite le code http://www.cppfrance.com/codes/MD5_10868.aspx qui, au moins, n'écrit 350 000 lignes de code pour gérer l'interface, il va droit au but.
Matt...
19 août 2006 à 20:41
Non seulement c'est plus lent (un strlen inutile), mais en plus c'est faux, car le 0 terminal n'est pas copié
C'était juste pour préciser, je viens de m'en rendre compte
13 août 2006 à 13:02
J'espère que ça sera de même pour beaucoup d'autres.
En tous cas merci à tous pour vos explications et éclaircissements.
P.S: je m'attaque à la mise à jour de YoyoMD5.
YOYO, @+.
13 août 2006 à 12:39
strncpy(PIcone.szTip, Tip, strlen(Tip));
est équivalent (sémantiquement, pas en terme de vitesse) à
strcpy(PIcone.szTip, Tip);
Pour éviter un débordement, il faut faire quelque chose du genre
strncpy(PIcone.szTip, Tip, MAX_SIZE);
ou MAX_SIZE est la taille disponible dans le buffer PIcone.szTip. Ca ne dépend pas de la longueur de Tip
13 août 2006 à 12:18
Le débordement est empêché d'une manière détournée, c'est-à-dire que la chaîne de caractères qui peut être copiée PIcone.szTip fait au maximum 63 de long (0 de fin exclus). Et comme szTip peut contenir au max 64 caractères, c'est nickel.
Cela n'empêche pas que BruNews a raison sur le fait que la version n de strcpy est dans ce cas inutile.
YOYO, @+.
11 août 2006 à 19:51
11 août 2006 à 19:41
11 août 2006 à 19:36
C'est exactement la meme chose si je fais
int tab[10];
int * p = tab;
sizeof tab == 10 * sizeof(int)
et
sizeof p == sizeof(void *)
Dans une fonction on ne peut que recevoir un pointeur contenant l'adresse du tableau, puisqu'il est impossible de passer un tableau à une fonction. Ce n'est pas la faute à sizeof, il faut juste avoir saisie la différence entre un tableau et un pointeur et comment on procède pour passer un tableau à une fonction.
11 août 2006 à 19:24
{
strcpy(buf, psrc, sizeof(buf));
}
int taille(int *tab)
{
return sizeof(tab);
}
4 à tout coup sur system 32 bits.
Si tableau n'est pas dans la portée du sizeof, on obtient la taille du pointeur selon le systeme mais assurément pas la taille du tableau.
11 août 2006 à 18:47
11 août 2006 à 11:46
11 août 2006 à 11:44
YOYO, @+.
11 août 2006 à 11:37
11 août 2006 à 11:25
En plus par la crème de cppfrance.
J'avais déjà lu quelque part que strcpy() n'était pas des plus fiables. Et en plus, je viens de lire que strcat() serait de la même trempe.
Je profite de cette occasion pour vous demandez si tout ceci est vrai ? Si oui, comment avoir une méthode fiable pour les remplacer ?(les pointeurs ?)
Merci Joky pour ton petit bout de code utilisant les pointeurs. Je m'y mets petit à petit, mais je suis encore un peu (voire beaucoup) "handicapé du pointeur" comme dirait BruNews.
Je vais essayer de corriger tout ça au plus vite.
Merci beaucoup pour votre aide.
YOYO, @+.
11 août 2006 à 10:45
Comment ça se fait qu'elle fait ça cette fonction ?
Et donc oui le *c=0 dans le if... :)
11 août 2006 à 10:42
GetCurrentDirectory:
Therefore, the size returned by the function may be two characters less than the size of the specified string, not including the terminating null character
Je sais pas si ca vous est déja arrivé, mais dans ce cas ca marcherait pas
11 août 2006 à 10:42
Se méfier de l'utilisation de sizeof, si le pointeur est reçu en param de fonction, sizeof = taille pointeur et rien d'autre. Il vaut mieux se faire un jeu de constantes en rapport à ce qu'on déclare en buffer.
11 août 2006 à 10:37
char *c;
c = szCurDir + GetCurrentDirectory(MAX_PATH, szCurDir);
if(*(c-1) != '\\')
*c++ = '\\';
*c = 0;
Beaucoup plus efficace que des appels à strlen + strcat
11 août 2006 à 10:29
http://www.cppfrance.com/infomsg_CONVERTIR-CHAR-CHAR_794339.aspx
Ca n'a vraiment aucun intérêt de faire ca
Pour empêcher un débordement de PIcone.szTip, il faut limiter la copie à la taille dispo dans PIcone.szTip et pas à la longueur de Tip
11 août 2006 à 10:06
Quel intérêt d'utiliser la version 'n' par rapport à strcpy si tu n'as pas de controle de longueur ??? Ici tu ne fais que parcourir la chaine 2 fois (strlen) au lieu d'1.