CRC16 berechnen

#3540883
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 ?
Gast #3540889
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.
#3540903
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 ... ?
Gast #3541186
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.
#3541284
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.
#3542546
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.
#3542571
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.
Gast #3542574
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?
#3542577
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.
#3542677
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.
#3542695
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...

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