mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik checksum


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

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

Gruß Michael

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehr gut erklärt.
Vielen Dank
Gruß Michael

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Die Union Alternative (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef union {
   unsigned long long_val;
   unsigned char byte_value[4];
} converter_t;

convertert_t cv;
unsigned int summe = 0;

cv.long_val = mein_long_value;
summe = byte_value[0] + byte_value[1] + byte_value[2] + byte_value[3];

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.