2010-01-20 5 views
2

Bonjour je suis un unsigned char * qui ressemble (après printf) comme celui-ci (c'est un SHA-1 hachage):La meilleure façon de convertir char * non signé en int?

n\374\363\327=\3103\231\361P'o]Db\251\360\316\203 

Je dois convertir cette unsigned char * à un unsigned int, que pensez-vous qu'il serait le meilleur façon de le faire? J'ai quelques idées, mais je ne suis pas un expert C donc je voulais voir d'autres idées avant d'essayer mes propres trucs.

+0

Ce n'est pas un 'char non signé 'que vous avez, sauf si vous avez une machine avec une architecture vraiment bizarre. Vous pourriez facilement avoir un 'char non signé 'pointant vers votre valeur. Exactement à quoi voulez-vous convertir cela, et pourquoi? –

Répondre

3

Pourquoi auriez-vous besoin d'une conversion? C'est un digest de 160 bits. Digests ne sont utilisés que de deux façons:

Vous imprimez un condensé avec quelque chose comme

for (i = 0; i < 20; ++i) { 
    printf("%2x", digest[i]); 
} 

et comparer contre un autre condensé avec quelque chose comme

for (i = 0, equals = 1; i < 20; ++i) { 
    if (a[i] != b[i]) { 
     equals = 0; 
    } 
} 

Il fonctionne très bien la façon dont il est aussi un tableau d'octets long de 20 octets. Vous n'avez pas à vous soucier de l'endianness, de la longueur des mots, de rien.

+0

Le problème est qu'une chaîne SHA-1 est 160 octets ... ce que je pense est que je pourrais utiliser un tableau de 5 bits 32 bits pour contenir toute la chaîne SHA-1 et faire une classe dédiée pour gérer les opérations de comparaison etc – Goles

+3

@Mr. Gando: Quelle est la différence entre un tableau de 20 caractères et un tableau de 5 ints, à des fins pratiques? Ce n'est pas comme si vous utilisiez les ints comme ints, tout comme 20 octets de stockage. Envelopper un résumé dans une classe est une bonne idée, mais utiliser un tableau d'ints plutôt que de caractères est inutile. –

+0

@David: Je suis d'accord. De plus, les caractères sont (presque) toujours longs de 8 bits (vous pouvez toujours vérifier CHAR_BIT, si vous avez vraiment besoin d'être ultra-portable), alors que les entiers non signés peuvent avoir des tailles différentes sur des machines différentes. petit gain. –

1

Cela fait 160 bits, ce qui serait difficile à intégrer dans un seul entier non signé. Cependant, il serait certainement possible de l'intégrer dans un tableau d'entiers non signés. Quelque chose comme ceci (laid, fait quelques suppositions sur l'architecture de la machine, devrait probablement utiliser CHAR_BITS et un couple d'autres choses à la compilation pour avoir les bonnes constantes, mais devrait suffire comme preuve de concept) :

 
unsigned int (*convert)(unsigned char *original) 
{ 
    unsigned int *rv = malloc(5*sizeof(unsigned int)); 
    char *tp = original; 

    for (rvix=0;rvix<5;rvix++) { 
    rv[rvix] = *(tp++)<<24; 
    rv[rvix] |= *(tp++)<<16; 
    rv[rvix] |= *(tp++)<<8; 
    rv[rvix] |= *(tp++); 
    } 

    return rv; 
} 
+0

Je pense que votre code a été coupé? pourriez-vous recoller cela? :-) – Goles

+0

Oui, cas classique de "oops, Vatine

+0

Merci vatine, c'est ton idée! – Goles

3

Eh bien, qui est plus de 4 octets, donc si votre système utilise 32 bits pour un entier non signé, vous ne pouvez pas le faire sans perdre des informations potentiellement. IOW, ça devra être une sorte de hash.

Questions connexes