Ckecksum Berechnung mit Startwert

Gast #6018053
Lesenswert?

Hi,
ich habe eine Frage.
Und zwar geht es um die CRC Berechnung mit einem Startwert.
Weiß leider gar nicht wie ich da vorgehen soll und muss. Hoffe jemand 
kann mir da helfen. Habe auch ein Beispiel. Wäre nett und gut, wenn 
jemand das Beispiel vorrechnen könnte. Muss es echt dringend verstehen. 
Es geht um SAE-J1850 CRC8 mit folggenden Daten. Was ich nicht verstehe 
ist, wie man den Startwert mit in die Berechnung einbringt.

CRC Result with: 8 bits
Polynomial: 1Dh
Initial Value: FFh
Input Data reflected: No
Result Date reflected: No
XOR value: FFh
Check: 4Bh
Magic Check: C4h

Danke schon mal im vorraus
Gast #6018247
Lesenswert?

Yalu X. schrieb:
> chisna schrieb:
>> Muss es echt dringend verstehen.
>
> Warum? Sitzt du gerade in einer Prüfung?
>
> Wenn nicht: In Wikipedia und gefühlten 1000 weiteren Webseiten ist doch
> alles (einschließlich dem Startwert) haarklein erklärt. Was konkret
> verstehst du daran nicht?

Ich habe mir die Seiten schon alle angeguckt so ist es  nicht. Habe die 
Berechnung mit Startwert= 0 auch verstanden. Mir fehlt das Verständnis, 
wie berechnet wird wenn der Startwert nicht gleich 0 ist sondern einen 
bestimmen Wert hat. Also wie in dem Beispiel oben. Vielleicht kann es 
jemand Handschriftlich lösen für ein besseres Verständnis. Das würde mir 
echt sehr weiterhelfen.

und nein bin in keiner Prüfung haha
Ist nur wichtig damit ich weiter komme in einem Projekt in der Uni
#6018360
Lesenswert?

Hier findest du eine einfach zu verstehende Implementierung in C:
https://www.elektronik-keller.de/index.php/tipps/15-avc-lan-crc-8-j-1850/24-avc-lan-crc-8-berechnung-j1850

Den Algorithmus "von Hand" durchzurechnen kann man natürlich versuchen, 
aber ob das zum Verständnis beiträgt weiss ich ja nicht.

Ganz am Anfang in crc8() siehst du, dass der Startwert dort auf 0xFF 
gesetzt wird.

Die letzte Zeile in crc8() finde ich etwas unglücklich:
1
return (~crc)&0xFF;

verständlicher wäre:
1
return (crc ^ 0xFF);
Gast #6018450
Lesenswert?

Joe F. schrieb:

> Die letzte Zeile in crc8() finde ich etwas unglücklich:
>
>
1
> return (~crc)&0xFF;
2
>
>
> verständlicher wäre:
>
1
> return (crc ^ 0xFF);
2
>

Verständlicher vielleicht. Aber u.U. auch schlicht falsch...

Kommt drauf an, wie im Kern der Sache genau gerechnet wird. Da gibt es 
viele Implementierungen, die zugunsten der Performance im Kern nur 
sicherstellen, das die unteren Bits korrekt sind. Dann muss am Ende 
maskiert werden und genau das ist, was deine bevorzugte Variante eben 
nicht tut, die von dir beanstandete aber schon.
Gast #6018483
Lesenswert?

Joe F. schrieb:

> Die Funktion
> unsigned char crc8()
> kann nur die unteren 8 Bit zurückgeben.

Das ist richtig. Richtig ist aber auch: richtige Programmiersprachen 
würden meckern, wenn du einfach was wegschneidest, ohne explizit 
hinzuschreiben, dass das deine Absicht ist.

Genau deswegen, weil C solch einen Programmierer-Schmutz zuläßt, ist es 
so hassenswert.

Trügerische Sicherheit eines de facto nicht wirklich vorhandenen 
Typsystems.

Da nimmt man besser gleich Assembler.

Aber: zumindest eine klitzekleine Warnung sollten heutige C-Compiler 
doch zumindest auch werfen?
Gast #6018498
Lesenswert?

c-hater schrieb:
> Genau deswegen, weil C solch einen Programmierer-Schmutz zuläßt, ist es
> so hassenswert.

Das Problem ist eher, dass die Leute kein lint hernehmen wollen, und 
dass sie über K&R nicht rausgekommen sind.
Wenn ich unsigned char oder long int lese, dreht's mir die Zehennägel 
auf. Das heißt uint8_t und uint32_t. Sonst nix.


Nick

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