Complement à 1 sur un buffer

Programmation d'applications complexes
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Complement à 1 sur un buffer

Message par Cls »

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 »

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 »

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 »

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 »

Ca marche, merci beaucoup pour ton aide.
Répondre