crc16.h aus Winavr

#3264234
Lesenswert?

Hallo!

Ich möchte gern eine CRC16 prüfung umsetzen. Dazu gibts ja eine 
wunderschöne Funktion im GCC in der CRC16.h. Doch ich kapier diese 
nicht. Ich habe mir hier im Wiki den Artikel zu CRC durchgelesen und 
soweit das Prinzip davon verstanden.

Doch jetzt frage ich mich, welche beiden Übergabewerte will die Funktion 
haben?

static _inline_ uint16_t
_crc16_update(uint16_t __crc, uint8_t __data)

Also welchen Wert meint hier __crc und welchen Wert __data?
Und was bekomme ich nun schlussletzendlich wieder zurück?

Das Polynominal wird ja als Zahlenwert in der Funktion geschrieben, 
nicht als Variable, also kann ich das ja schonmal nicht an die Funktion 
übergeben..

Ich kapiers einfach nicht, ich hoffe, es bringt jemand etwas Licht in 
mein Dunkel.

Danke dafür schonmal imm Voraus.


Dennis
#3264297
Lesenswert?

Timmo H. schrieb:
> http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html

das hab ich soweit gelesen, dort ersehe ich raus, das dort mit crc und 
data eine xor Operation gemacht wird. Ich frage mich einfach, warum wird 
diese Operation vorher gemacht. Diese ist im Artikel über CRC so für 
mich nicht ersichtlich, deswegen verstehe ich sie nicht. Ich denke, wenn 
ich das kapiert habe, kann ich mir selber beantworten, welche Daten die 
Funktion haben möchte.

Ich denke, es ist einfach eine Art Code-Optimierung, die ich nicht 
kapiere.

Dennis
#3264324
Lesenswert?

Dennis H. schrieb:
> Ich denke, wenn
> ich das kapiert habe, kann ich mir selber beantworten, welche Daten die
> Funktion haben möchte.

Nö, das ist ein Detail der Implementierung, dessen Verständnis dich wohl 
eher nicht deiner ursprünglichen Fragestellung näher bringt. Das erste 
Code-Beispiel unter dem Link ist das, was dir zeigt wie die 
CRC-Funktionen zu verwenden sind. Das ist es, was du studieren solltest. 
Das ist eigentlich ziemlich selbsterklärend.
#3264326
Lesenswert?

Ich will sie nur verwenden. Für mich heißt das, ich gebe dieser Funktion 
meine Variable, die ich gern mit einer prüfsumme versehen möchte. Und 
ich bekomme genau meine Variable plus Prüfsumme wieder. Eine Variable 
übergeben, eine zurück bekommen. Diese Funktion will aber zwei Variablen 
übergeben bekommen..


Dennis
#3264337
Lesenswert?

Dennis H. schrieb:
> Eine Variable
> übergeben, eine zurück bekommen. Diese Funktion will aber zwei Variablen
> übergeben bekommen..

Weil eine CRC nun mal eher selten für nur eine Variable benutzt wird, 
sondern für einen ganzen Block von Daten. Der eine Parameter ist die 
aktuelle (fortlaufende) CRC, der Zweite das nächste Datenbyte, und der 
Rückgabewert ist die neue CRC.
#3264793
Lesenswert?

Heinz schrieb:
> Wieso nimmt die Funktion nicht einfach einen Zeiger und eine
> Längenangabe entgegen?
> Spricht da vom Prinzip her was dagegen?

Es wäre weniger flexibel. Weiteres Beispiel neben dem, was "Sauger" 
geschrieben hat, wenn die Datensätze unterschiedliche Längen haben 
können und mit einer Terminierung versehen sind (z.B. Strings), dann 
müsste der Datensatz zweimal durchlaufen werden. Einmal in der 
CRC-Funktion und einmal vorab, um überhaupt erst mal die Länge 
festzustellen.

So kann man einfach einen Wrapper darum legen, der dann das gewünschte 
Interface hat. Z.B. dein Zeiger/Länge-Interface, oder eines wo nur ein 
Zeiger übergeben wird (bei fester Länge, oder bei Terminierung), oder 
die Wrapper-Funktion liefert die CRC gar nicht zurück, sondern fügt sie 
gleich dem Datensatz hinzu, oder ...

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