Checksumme

Gast #217074
Lesenswert?
• ▲
▼
Hallo,

ich sammele Daten auf einer MMC.
Nun würde ich diese gerne per Checksumme sichern. Die Algorithmen, die
man findet sind aber irgendwie alle ein wenige umständlich.

Gibt es keine einfach Möglichkeit, einfach einen Algorithmus (ohne
Look-Up-Table, avrgcc) über 511 Elemente eines unsigned char Array
laufen zu lassen und das Ergebnis im 512. Element zu speichern?

Nach Möglichkeit sollte die Aktion auch keine paar 100ms dauern.

Falls jemand praxistaugliche Tipps hat, wäre ich dankbar. Muss ja nicht
unbedingt eine CRC sein, andere Verfahren sind auch willkommen.

Es geht nur darum zu erkennen, dass ein Sektor komplett beschrieben
wurde (keine Unterbrechung der Spannungsversorgung) und die Daten
konsistent sind.

Danke,
Alex
#217075
Lesenswert?
• ▲
▼
Hallo Alex,

CRC ist IMHO keine sonderlich komplizierte Angelegenheit (solange man
sie nicht wirklich evrstehen möchte). Man kann ganz einfach die
CRC-Funktionalitäten in avr-libc (siehe Dokumentation dazu) verwenden.

Einfacher ist natürlich die Möglichkeit, alle Datenelemente
aufzusummieren und die Summe dann modulo 256 abzulegen (Modulo ist der
ganzzahlige Rest bei der Division - für die die es nicht wissen).

Daneben existieren noch Massen an Verfahren - aber entweder nimmt man
ein schon implementiertes oder ein gaaanz einfaches, es sei denn man
hat spezielle Anforderungen.

MfG, Daniel
Gast #217076
Lesenswert?
• ▲
▼
Vielleicht kannst Du etwas von dem Algorithmus abschauen, der bei
NMEA-Datensätzen verwendet wird (GPS). Hier mal ein Beispiel
(allerdings in Java!)
1
/**
2
 * calculates the NMEA checksum using XOR. The NMEA checksum does not
3
include the first and last character
4
 * of the message ('$' and '*'). The input parameter has to be
5
provided without these characters.
6
 * @param input   String for checksum calculation.
7
 */
8
public static String getChecksum(String input)
9
{
10
    byte result = 0;
11
    int len = input.length();
12
    for (int i=0; i < len; i++) {
13
        result ^= input.charAt(i);
14
    }
15
    
16
    return Integer.toHexString((int) result).toUpperCase();
17
}

Gruß, Achim.
Gast #217080
Lesenswert?
• ▲
▼
Naja, kommt eben darauf an, welche Fehler Du entdecken willst.

Und Du kannst bei einer CRC auch die Tabelle weglassen, dann wird's
eben ein wenig langsamer.

Aber die Angabe "100 ms" ist eben sehr relativ. Ein
Low-Power-Prozessor mit 100 kHz macht da deutlich weniger als ein mit
100 MHz getakteter Signalprozessor...
Gast #217083
Lesenswert?
• ▲
▼
Schon klar, ist alles andere als mein erstes gcc-Projekt. Wichtig war,
dass sogar der äquivalente C-Source beigelegt ist, damit ich auf der PC
Seite ohne Probleme das Gegenstück implementieren kann.

Alex

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren