Einfacher Checksummen Algorithmus



  • Hallo!

    Ich habe eine Struktur, welche ein paar Variablen vom Typ int enthält.

    struct EineStruktur
    {
      unsigned int a;
      unsigned int b;
      unsigned int c;
      unsigned int d;
      unsigned int e;
    };
    

    Ich bräuchte einen Algorithmus zum Berechnen einer Checksumme.
    Anforderungen:
    + möglichst effizient
    + Ergebnis muss ein unsigned char (=Byte) sein

    Naiver Vorschlag:

    unsigned char checkSumme=data.a+data.b+data.c+data.d+data.e;
    

    Kleine Verbesserung um die Positionierung miteinzubeziehen:

    unsigned char checkSumme=data.a*1+data.b*2+data.c*3+data.d*4+data.e*5;
    

    Nun gibt es ja verschiedene Algorithmen wie z.B. die "Fletcher's checksum".
    Bringt es einen großen Vorteil, solche Algorithmen zu verwenden, oder ist der zweitgenannte Vorschlag von mir auch brauchbar?



  • Unbrauchbar.
    Du musst deine unsigned int schon in Byte zerlegen, sonst bringt deine Summe gar nichts, da ja nur das LSB in dem unsigned char abgelegt wird.

    Und wenn du dir Fletcher angesehen hast, wirst du feststellen, das die chesksumme doppelt so viel Speicher braucht, wie die Einzelwerte ( 8 Bit Werte -> 16 Bit Checksumme).
    Du willst es aber anders herum.



  • mehr als 1byte für die Checksumme hab ich leider nicht zu Verfügung.

    Du meinst also sowas in der Art:

    unsigned char checksumPartA=
    data.a&0x000000FF
    +(data.a&0x0000FF00)>>8
    +(data.a&0x00FF0000)>>16
    +(data.a&0xFF000000)>>24;
    

    Damit würden dann zumindest alle 32 Bits von data.a ins Ergebnis einfließen.

    und dann noch das gleiche für b,c,d,e und schließlich zusammenzählen?





  • bzw. einfacher:
    zuerst alles in einem unsigned int zusammenzählen, dann alle 32 Bit in einen Byte einfließen lassen.

    unsigned int sum=data.a+data.b+data.c+data.d+data.e;
    unsigned char checksum=
    sum&0x000000FF
    +(sum&0x0000FF00)>>8
    +(sum&0x00FF0000)>>16
    +(sum&0xFF000000)>>24;
    


  • calc_checksum schrieb:

    bzw. einfacher:
    zuerst alles in einem unsigned int zusammenzählen, dann alle 32 Bit in einen Byte einfließen lassen.

    unsigned int sum=data.a+data.b+data.c+data.d+data.e;
    unsigned char checksum=
    sum&0x000000FF
    +(sum&0x0000FF00)>>8
    +(sum&0x00FF0000)>>16
    +(sum&0xFF000000)>>24;
    

    so funktioniert es jetzt, einzig die klammernsetzung hat noch nicht gepasst: es muss jeder term zusätzlich geklammert werden damits stimmt.


Anmelden zum Antworten