2008-12-09 5 views
1
typedef union 
{ 
    uint ui[4]; 
} md5hash; 

void main(void) 
{ 
    int opt; 

    while ((opt = getopt(argc, argv, "c:t:s:h:")) != -1) { 
     switch (opt) { 
     case 'h': 
      hash = optarg; 
      break; 
     default: /* '?' */ 
      exit(EXIT_FAILURE); 
     } 
    } 

    md5hash hash; 

    sscanf(hash, "%x%x%x%x", &hash.ui); 
} 

./program -h ffffffffffffffffffffffffffffffffComment accepter un md5sum via une ligne de commande en C?

Je veux faire ce qui précède, mais sscanf ne l'accepte pas le md5sum correctement ...

+0

vous devriez lire la page de manuel de sscanf. il explique tout le spécificateur de format et d'autres choses. –

+0

Notez que "main" renvoie int. Toujours. Il ne retourne jamais nul. –

Répondre

5
  1. Vous semblez avoir deux variables appelées hash, sauf une est implicite dans votre code.
  2. L'instruction sscanf tente de lire à nouveau hash en elle-même, mais de toute évidence, elle ne trouve aucun chiffre hexadécimal.
  3. %x peut charger un entier de taille différente en hexadécimal sur différentes plates-formes car vous n'avez spécifié aucune longueur spécifique à lire pour chaque champ.
  4. Vous ne prenez pas en compte l'endianness machine.

Si vous avez une chaîne hexadécimale, disons en hashString alors vous pouvez probablement essayer

int fieldsScanned = sscanf (hashString, "%8x%8x%8x%8x", &hash.ui[0], &hash.ui[1], &hash.ui[2], &hash.ui[3]); 

if (fieldsScanned == 4) 
{ 
    // MD5 sum is in hash variable. 
} 
+0

Il y a aussi d'autres problèmes avec le code. Tels qu'un syndicat avec un membre est plutôt inutile. –

+0

Séparément, votre code sscanf() correspondrait à une somme de contrôle MD5 incorrect avec seulement 25 chiffres hexadécimaux. Vous devriez probablement faire un examen plus approfondi de la chaîne avant de l'accepter - tous les chiffres hexadécimaux et la longueur est de 32 - bien qu'un chiffre non hexadécimal avant le début de la dernière conversion échouerait de toute façon. –

0
int 
parse_hex(char *s, unsigned char *hex, int len) 
{ 
    int i, r = 0; 

    len *= 2; 
    for (i = 0; ; i++, s++) 
    { 
     if (*s == 0 && !(i & 1)) 
     return i/2; 
     if (i == len) 
     { 
      fprintf(stderr, "parsehex: string too long\n"); 
      //exit(1); 
     } 
     if (*s >= '0' && *s <= '9') 
     r = (r << 4) | (*s - '0'); 
     else if (*s >= 'a' && *s <= 'f') 
     r = (r << 4) | (*s - ('a' - 10)); 
     else if (*s >= 'A' && *s <= 'F') 
     r = (r << 4) | (*s - ('a' - 10)); 
     else 
     { 
      fprintf(stderr, "parsehex: bad string\n"); 
      //exit(1); 
     } 
     if ((i & 1) != 0) 
     { 
      hex[i/2] = r; 
      r = 0; 
     } 
    } 
} 

void 
parse_md5(char *s, unsigned char *md5) 
{ 
    if (!*s) 
    { 
     memset(md5, 0, 16); 
     return; 
    } 
    if (parse_hex(s, md5, 16) != 16) 
    { 
     fprintf(stderr, "parsemd5: bad md5\n"); 
     //exit(1); 
    } 
} 

En fait, la méthode sscanf() ne fonctionne pas, il lit les octets inverser l'ordre dans les doubles mots.

Questions connexes