Forum: Mikrocontroller und Digitale Elektronik checksum


von Michael (Gast)


Lesenswert?

Hallo,

ich muß aus einer 4Byte großen Zahl die Cheksumme bilden in dem jedes
Byte addiert wird.
z.B.
Dezimalzahl=560731841=21 6c 16 c1 ergibt Summe=356
gibt es da einen schlanken Lösungsweg in C zur Berechnung der Summe?

Gruß Michael

von The Daz (Gast)


Lesenswert?

Fuer nen uC wuerde ich

int checksum = ((unsigned char*)&dez)[0] +
               ((unsigned char*)&dez)[1] +
               ((unsigned char*)&dez)[2] +
               ((unsigned char*)&dez)[3];

nehmen.

von Michael (Gast)


Lesenswert?

ich bin noch Anfänger, kannst Du mir das etwas genauer erläutern?

Gruß Michael

von The Daz (Gast)


Lesenswert?

Naja, du hast deinen Ausgangswert in einem 4-byte integer gespeichert.
Dein Ziel ist es, jedes dieser 4 bytes aufeinander zu addieren. Man
nehme also die Adresse der 4 byte integer variable (&dez) und wandle
den Pointer in einen Zeiger auf einen byte array um ((unsigned
char*)&dez). Mit diesem Zeiger kann man jetzt schoen einfach jedes
einzelne byte auslesen ((unsigned char*)&dez[index]). Man kann es auch
so schreiben :

unsigned char *byteArray = (unsigned char*) &dez;
int checksum = byteArray[0] +
               byteArray[1] +
               byteArray[2] +
               byteArray[3];

von Michael (Gast)


Lesenswert?

sehr gut erklärt.
Vielen Dank
Gruß Michael

von The Daz (Gast)


Lesenswert?

Gerne doch. Dies ist zwar die dreckige Variante (pointer + casts) aber
fuer den uC besser als teures Bit-Schieben. Wenn performance + Speicher
kein Problem sind wuerde ich immer bits schieben.

von Die Union Alternative (Gast)


Lesenswert?

1
typedef union {
2
   unsigned long long_val;
3
   unsigned char byte_value[4];
4
} converter_t;
5
6
convertert_t cv;
7
unsigned int summe = 0;
8
9
cv.long_val = mein_long_value;
10
summe = byte_value[0] + byte_value[1] + byte_value[2] + byte_value[3];

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.