Page 1 sur 1

Complement à 1 sur un buffer

Publié : sam. 08/avr./2006 18:26
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);
}

Publié : sam. 08/avr./2006 18:43
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]

Publié : dim. 09/avr./2006 19:18
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...

Publié : dim. 09/avr./2006 22:35
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]

Publié : lun. 10/avr./2006 12:42
par Cls
Ca marche, merci beaucoup pour ton aide.