
Envoyé par
jonny
en fait la fonction que j'utilise sert a calculer le checksum d'une entete ip, et je l'ai trouvé sur internet. En cherchant bien un peu partout je me suis apercu que c'etait toujours le meme algo sur tout les sites. Donc j'ai preferé ne pas la changer.
Ma variable char * est indispensable dans mon programme je ne peux pas m'en passé. Le probleme est maintenant comment faire pour trouvé une entente entre les 2.
voici ma fonction :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
unsigned short in_cksum(unsigned short *addr, int len)
{
register int sum = 0;
u_short answer = 0;
register u_short *w = addr;
register int nleft = len;
while (nleft > 1)
{
sum += *w++;
nleft -= 2;
}
if (nleft == 1)
{
*(u_char *) (&answer) = *(u_char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
} |
Si quelqu'un arrive a me changer cette fonction afin qu'elle fonctionne avec du char* et non du unsigned short ca serait vraiment sympa parce que je n'y arrive pas ....
C'est un non-sens. car le checksum est calculé sur 16-bits.
Ce code fonctionne sous conditions (pas portable) :
- Un char doit faire 8 bits
- Un short doit faire 16 bits
- La longueur utile 'len' (en char) de la trame doit être est paire
- La trame est un tableau de de type unsigned char d'une taille >= 'len'
Si ces conditions sont réunies, tu peux faire ça :
unsigned short cs = in_cksum ((unsigned short *)trame, len);
Partager