Forum: Mikrocontroller und Digitale Elektronik CRC16 berechnen


von Michael L. (nightflyer88)


Lesenswert?

Hallo Zusammen

Ich weis, das Thema wurde hier schon X-1000-mal behandelt, ich komme 
trotzdem nicht ganz nach wie man von einem Datenpacket, das CRC16 
berechnet.

Soviel hab ich verstanden:

Das Generatorpolynom ist sozusagen der Schlüssel.
Folgendes Beispiel hab ich soweit auch verstanden: 
http://de.wikipedia.org/wiki/Zyklische_Redundanzprüfung

Im Beispiel wird als Nutzdaten nur ein Byte verwendet, aber wie schaut 
es aus, wenn man ein ganzes Datenpaket mit mehreren Bytes hat ? Wie 
funktioniert da die Berechnung ?

Als einfaches Beispiel möchte ich aus folgenden Bytes das CRC16 
berechnen:

Datenpaket (DEZ): 150,23,45,122

Welches Generatorpolynom sollte verwendet werden ? Dies sollte 16bit 
sein (CRC16) richtig ? Kann da eine willkürliche Zahl verwendet werden ?

Wie genau muss man nun vorgehen, um aus den 4 bytes das CRC16 zu 
erhalten ?

von Bitflüsterer (Gast)


Lesenswert?

Entschuldige, aber was genau hast Du an dem Wikipedia-Artikel nicht 
verstanden?

Verstehe mich bitte recht. Es ist durchaus legitim, das Du was nicht 
verstehst. Das geht allen so.

Aber in dem Artikel ist jede Deiner Fragen beantwortet. Welche Aussage 
oder welches Detail verstehst Du nicht? Schreibe das bitte.

von Michael L. (nightflyer88)


Lesenswert?

Also im beispiel wird aus 1 byte (Nutzdaten) das CRC berechnet. Soweit 
klar.

Hab ich nun meherer bytes als nutzdaten, wie muss ich nun vorgehen ? Aus 
dem ersten byte crc berechnen, das zweite byte zum crc dazu addieren, 
wieder crc berechen, drittes bytes zum crc addieren, wieder crc 
berechnen, usw ... ?

von doppelschwarz (Gast)


Lesenswert?

Bei der Wahl des Generatorpolynom sollte man darauf achten, dass die 
gewünschten Fehlerentdeckungen enthalten sind. Also nicht einfach 
irgendwas nehmen, sondern am besten ein Polynom, das passt. Je nach 
Polynom können unterschiedliche Fehlerarten aufgedeckt werden (1 Fehler 
sicher, 2 Fehler mit x% usw.). Am besten etwas nehmen, was schon 
anderswo eingesetzt wird, z.B. (aus 
http://de.wikipedia.org/wiki/Zyklische_Redundanzprüfung#Polynome_und_Typen) 
CRC-CCITT. Das Ergebnis kann man auch ganz einfach hier prüfen:
http://zorc.breitbandkatze.de/crc.html (Hexwerte mit % eingeben, also 
0x2F => %2F).

Das Ergebnis des ersten Bytes ist der Startwert des nächsten. Man kann 
sich das wie bei der Polynomdivision oder normaler Division von Hand 
vorstellen. Man arbeitet sich von vorne nach hinten durch und bestimmt 
den Rest, das eigentliche Ergebnis ist uninteressant, ähnlich wie bei 
der Modulo-Rechnung.

von Karl H. (kbuchegg)


Lesenswert?

Michael L. schrieb:
> Also im beispiel wird aus 1 byte (Nutzdaten) das CRC berechnet. Soweit
> klar.

Nicht wirklich.
Denn wenn man genau liest, dann steht da nicht 1 Byte. Das da genau 8 
Bits verrechnet werden ist mehr oder weniger zufällig so.

Wenn du das Array 'datastream' entsprechend größer machst und anstelle 
von 8 in databits die korrekte Zahl einträgst, dann geht das auch mit 
mehr als nur 1 Byte.

> Hab ich nun meherer bytes als nutzdaten, wie muss ich nun vorgehen ?

Die gezeigte Implementierung in Wikipedia ist da etwas unglücklich 
gewählt. In der Praxis hat man eine CRC Funktion, der man 1 Byte samt 
bisheriger CRC reingibt und die dieses eine Byte auf die CRC aufrechnet. 
Man kriegt dann die modifizierte CRC zurück, die man dann zum Beispiel 
weiter behandelt, indem man sie mit dem nächsten Byte und eben diese CRC 
erneut in die CRC Funktion steckt, woraufhin man dann die nächste 
modifizierte CRC bekommt.
Das ganze ist also meistens ein schleifenartiger Prozess
1
  crc = Startwert;
2
3
  for( i = 0; i < Anzahl der Bytes; i++ )
4
    crc = berechne_crc( byte[i], crc );
5
6
  mach was mit der über alle Bytes berechneten crc

Es gibt genug frei verfügbare Implementierungen im Web. Schau dir ein 
paar an. Meist wirst du auf so einen oder einen ähnlichen Mechanismus 
stossen. Nicht gegen Wikipedia. Aber in Punkte "Darstellung von 
Algorithmen" ist es nicht das Non-Plus-Ultra. Da fährt man besser, wenn 
man sich auf ein paar unterschiedlichen Web-Seiten ein paar 
Implementierungen ansieht und sich die Gemeinsamkeiten und Unterschiede 
ansieht.

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Ist das so richtig, wenn ich einfach alle bytes aneinander hänge ?

Auf dem Papier funktionierts.

von Karl H. (kbuchegg)


Lesenswert?

Das kann nicht richtig sein.
Denn 10111 ist kein Byte. Ein Byte hat 8 Bit. Immer. Selbst wenn da 
einige Bits als führende 0-en zu bezeichnen sind.


Logisch funktioniert das bei dir.
CRC ist ja so gebaut, dass man beliebige Bitzahlen reinstecken kann.
Aber: mit den Vorgaben steckst du andere Bits in dein Verfahren rein, 
als es jeder andere auf diesem Planeten tun würde.
D.h. mit deinen Zahlen kriegt jemand anderer einen anderen CRC Wert 
raus. Der natürlich so gemacht ist, dass sich bei ihm auch wieder alles 
am Ende aus geht.

: Bearbeitet durch User
von Mr.T (Gast)


Lesenswert?

Karl Heinz schrieb:
> Ein Byte hat 8 Bit.

Was Blödsinn ist. Ein byte ist die kleinste adressierbare Einheit! Auf 
einem 320C40 ist ein Byte 32bit groß. Und nun?

von Michael L. (nightflyer88)


Lesenswert?

> Ein Byte hat 8 Bit.

Ist mir schon klar

Ich dachte, ich könnte die führenden nullen weglassen.


> als es jeder andere auf diesem Planeten tun würde

Aber wie genau muss ich denn das machen ? Die ganzen bytes inkl. nullen 
aneinander hängen ? Oder alles total falsch ??

von Karl H. (kbuchegg)


Lesenswert?

Mr.T schrieb:
> Karl Heinz schrieb:
>> Ein Byte hat 8 Bit.
>
> Was Blödsinn ist. Ein byte ist die kleinste adressierbare Einheit!

Auf deiner Architektur vielleicht. In der Programmiersprache in de rdu 
arbeitest.

> Auf
> einem 320C40 ist ein Byte 32bit groß. Und nun?

Dann nennt man das ein Double-Word. Niemand hat ein Problem damit, dass 
auf dieser Architektur die kleinste adressierbare EInheit ein DWord ist.

von Fred (Gast)


Lesenswert?

Karl Heinz schrieb:
>> Auf
>> einem 320C40 ist ein Byte 32bit groß. Und nun?
>
> Dann nennt man das ein Double-Word. Niemand hat ein Problem damit, dass
> auf dieser Architektur die kleinste adressierbare EInheit ein DWord ist.

Und C nennt diese kleinste Einheit eben "Byte". Aber das weißt du doch?

von Karl H. (kbuchegg)


Lesenswert?

Fred schrieb:
> Karl Heinz schrieb:
>>> Auf
>>> einem 320C40 ist ein Byte 32bit groß. Und nun?
>>
>> Dann nennt man das ein Double-Word. Niemand hat ein Problem damit, dass
>> auf dieser Architektur die kleinste adressierbare EInheit ein DWord ist.
>
> Und C nennt diese kleinste Einheit eben "Byte". Aber das weißt du doch?

Hier gehts aber nicht um C. Hier geht es um die Berechnung einer CRC 
ganz allgemein.

Die Kapazität eines Bytes auf deiner Festplatte ist 8 Bit.
Ein Grafikspeicher mit 1024 Bytes, besteht aus 1024*8 Bits.
Wenn 3 Nutzbytes über eine Schnittstelle übertragen werden, dann sind 
das 3 mal 8 gleich 24 Bit.
...

Völlig unabhängig davon, wieviele Bits dein µC zu einer addressierbaren 
Einheit zusammenfasst.

: Bearbeitet durch User
von Phantomix X. (phantomix)


Lesenswert?

> Und C nennt diese kleinste Einheit eben "Byte". Aber das weißt du doch?

C nennt die kleinste Einheit "char" und das ist definiert mit 1 Char = 1 
Byte. Was dazu führt, dass auf Architekturen mit 16 oder 32 Bit 
minimaler Wortbreite das char und damit das Byte eben 16 oder 32 Bit 
breit ist.

von Karl H. (kbuchegg)


Lesenswert?

Phantomix Ximotnahp schrieb:
>> Und C nennt diese kleinste Einheit eben "Byte". Aber das weißt du doch?
>
> C nennt die kleinste Einheit "char" und das ist definiert mit 1 Char = 1
> Byte.

Was darauf hinausläuft, das C seine eigene Vorstellung davon hat, was 
ein Byte ist.
Die kann, muss aber nicht, mit dem übereinstimmen, was landläufig unter 
einem Byte verstanden wird.

Wenn mir aber jemand eine händische CRC Berechnung auf Papier 
unterjubelt auf der der Begriff 'Byte' vorkommt, dann wende ich die 
landläufige Sichtweise an, was ein Byte ist und sicher nicht das was C 
darunter versteht. Abgesehen davon, dass auf dem Papier der 
konzeptionell gleiche Fehler gemacht wird, egal ob man nun 1 Byte mit 8 
Bit annimmt oder mit mehr.

So gesehen kann man sich an der Verwendung des Wortes 'immer' stossen. 
Man hätte es aber auch damit gut sein lassen können, denn ein C-Byte ist 
nicht dasselbe, was der Rest der EDV Welt unter einem Byte versteht. Und 
hier war ganz klar erst mal nicht von C die Rede.

: Bearbeitet durch User
von Phantomix X. (phantomix)


Lesenswert?

Karl Heinz schrieb:
> Was darauf hinausläuft, das C seine eigene Vorstellung davon hat, was
> ein Byte ist.
> Die kann, muss aber nicht, mit dem übereinstimmen, was landläufig unter
> einem Byte verstanden wird.

Ack.

> So gesehen kann man sich an der Verwendung des Wortes 'immer' stossen.

Hab ich hiermit getan. Andere Leute stoßen sich an Worten wie "Byte" ;-) 
Egal also.

Der Übersicht halber würde ich aber die führenden Nullen immer mit 
hinschreiben, sonst führt das nur zu Verwirrungen (siehe oben)

Mit http://zorc.breitbandkatze.de/crc.html wurde ja schon der wichtigste 
Link genannt der dem Threadersteller helfen könnte...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.