YOYOMD5 - CALCUL ET AFFICHAGE DE LA CLEF MD5 D'UN FICHIER

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 11 août 2006 à 10:06
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/39043-yoyomd5-calcul-et-affichage-de-la-clef-md5-d-un-fichier

cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
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és 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
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és 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
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és 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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és 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
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és 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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és 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2006 à 19:24
void func(char *buf, char *psrc)
{
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.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
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és 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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és 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
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és 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
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és 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
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és 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.
Rejoignez-nous