Programmation d'applications complexes
Cls
Messages : 620 Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes
Message
par Cls » sam. 08/avr./2006 18:26
Bonjour à tous,
je voudrais calculer le complement à 1 d'un bufffer de données sur 16bit.
C'est en fait la somme de controle d'un paquet IP. J'ai bien une procédure en C mais j'avoue que j'ai du mal à la convertir...
Code : Tout sélectionner
unsigned short
checksum(unsigned short *buffer, int size)
{
unsigned long cksum = 0;
while (size >1){
cksum += *buffer++;
size -= sizeof(unsigned short);
}
if (size) {
cksum += *(unsigned char *)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (unsigned short)(~cksum);
}
KarLKoX
Messages : 1191 Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :
Message
par KarLKoX » sam. 08/avr./2006 18:43
Code : Tout sélectionner
Procedure.w CheckSum(*buffer.w, size.l)
protected cksum.l = 0
protected cksize
cksize = size
while cksize > 1
cksum + *buffer
*buffer + 2
cksize - sizeof(Word)
wend
cksum = (cksum >> 16) + (cksum & $FFFF)
cksum + (cksum >> 16)
procedurereturn (~cksum & $FF)
EndProcedure
Pas testé.[/code]
"Qui baise trop bouffe un poil." P. Desproges
Cls
Messages : 620 Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes
Message
par Cls » dim. 09/avr./2006 19:18
Alors j'ai un problème sur cette routine, que je n'arrive pas à dénicher. La valeur renvoyée par CheckSum n'est pas fonction de ce que je mets dans le buffer mais de sa taille...
KarLKoX
Messages : 1191 Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :
Message
par KarLKoX » dim. 09/avr./2006 22:35
Code : Tout sélectionner
Procedure.w CheckSum(*buffer.w, size.l)
Protected cksum.l
Protected cksize
cksum = 0
cksize = size
While cksize > 1
cksum + PeekW(*buffer)
*buffer + 2
cksize - SizeOf(Word)
Wend
If cksize > 0
cksum + PeekW(*buffer)
EndIf
cksum = (cksum >> 16) + (cksum & $FFFF)
cksum + (cksum >> 16)
ProcedureReturn (~cksum) & $FF
EndProcedure
Global Dim buffer.w(16)
buffer(0) = 1
buffer(1) = 1
buffer(2) = 1
buffer(3) = 1
buffer(4) = 1
buffer(5) = 1
buffer(6) = 1
buffer(7) = 1
buffer(8) = 1
buffer(9) = 1
buffer(10) = 1
buffer(11) = 1
buffer(12) = 1
buffer(13) = 1
buffer(14) = 1
buffer(15) = 1
crc.w = Checksum(buffer(),32) ; 32 = 16 * sizeof(short)
Debug Str(crc)
Version (normalement) corrigée
[/code]
"Qui baise trop bouffe un poil." P. Desproges
Cls
Messages : 620 Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes
Message
par Cls » lun. 10/avr./2006 12:42
Ca marche, merci beaucoup pour ton aide.