Wie funktioniert der CRC-check gegen 0

OP #1481038
Lesenswert?

Hi. Ich habe folgendes Problem. Und zwar möchte ich zur Datensicherheit 
innerhalb eines CAN-Netzwerkes eine zusätzliche CRC einfügen. Zur 
Generierung der CRC verwende ich folgenden Algorithmus:

static uint16 get_crc(uint8 *bufp, uint32 buflen, uint32 polynom)
{
    uint32 crc;
    int n;


    crc = 0;
    for ( ; buflen > 0; buflen--, bufp++)
    {
        crc += (uint32)(*bufp << 16);

        for (n=0; n<8; n++)
        {
            if (crc & 0x00000001)
            {
                crc ^= polynom;
            }
            crc >>= 1;
        }
    }
    return ((uint16)crc);
}

Wie kann ich denn jetzt, quasi am anderen Ende, testen, ob die CRC 
richtig ist. Gibt es da nicht einen Test gegen 0, bei dem mit Sicherheit 
gewährleistet ist, dass die übertragenen Daten konsitent sind? Irgendwie 
blick ich bei dem CRC generieren nicht so richtig durch.

MfG
#1481052
Lesenswert?

Davos Rit schrieb:
> Also berechnet der Empfänger ebenfalls eine CRC und zieht dann die
> empfangene davon ab und bei einem Ergebnis von 0 stimmen beide überein?

Du brauchst nichts abziehen.
Der CRC ist so konstruiert, dass der Empfänger ebenfalls seine CRC 
mitrechnet. Soweit stimmt es noch. Aber wenn er dann das CRC Byte 
empfängt und dieses CRC Byte in seine eigene Berechnung noch mit 
einfliessen lässt, dann kommt 0 raus.

Du schiebst einfach nur das Datenpaket (inklusive der gesendeten CRC) im 
Empfänger durch den CRC Algorithmus durch und das Ergebnis davon muss 0 
sein.

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