Guten Abend,
ich möchte gerne die CRC (16)-CCITT (XModem) von A90064 von Hand
berechnen.
A90064 --> 1010 1001 0000 0110 0100
Generatorpolynom 0x8408 --> 1000 0100 0000 1000
Ich habs mal probiert, an meine Nutzdaten die Nullen (r=15) angehängt
und mit dem Generatorpolynom ein polynomdivison durchgeführt. Allerdings
komme ich nicht auf das gleiche Ergebnis wie wenn ich die Nutzdaten bei
lammertbies.nl-Checksum Calculator (Input-Type Hex) eingebe. Was mach
ich da nur falsch? Das Thema CRC wurde hier im Forum ja des öfteren
durchgekaut, würde mich aber freuen, wenn mir jemand auf die Sprünge
helfen könnte.
VG.
Kurt
Kurt K. schrieb:> Keiner eine Idee? Ich finde im Netz kein Rechenbeispiel...
Hallo,
was hast du denn gegen die Online-Berechnung? Von Hand ist viel zu
mühsam, selbst wenn du richtig rechnest.
Gruss Reinhard
>Guten Abend,
Moin Kurt... ich bin momentan nicht in der Naehe meiner
"CRC Unterlagen", daher nur 95%-Aussagen ;-) ...
>ich möchte gerne die CRC (16)-CCITT (XModem)
Nein. Polynom CCITT= (1)1000010000001000 <>
Polynom XModem=(1)0001000000100001
> von A90064 von Hand berechnen.> A90064 --> 1010 1001 0000 0110 0100
Nein, Verschreiber? 1010 1001 0000 0000 0110 0100
> Generatorpolynom 0x8408 --> 1000 0100 0000 1000
Nein, s.o.
>an meine Nutzdaten die Nullen (r=15)
Nein. Das ist der Startwert (s.u "crc = 0;")
ARGH! Das Anfuegegeruecht haelt sich hartnaeckig...
>lammertbies.nl-Checksum Calculator (Input-Type Hex) eingebe.
Mein Favourit ist pycrc. Das Teil generiert Dir anhand einer
"Commandline-Spec" den C-Code...
Bzw. man suche auf atmel.com nach "AVR350"
(Xmodem CRC Receive Utility for tinyAVR and megaAVR devices).
Zitat aus calcrc.c:
-x-x-x-x-x-x-x-x- snip -x-x-x-x-x-x-
...
int calcrc(unsigned char *ptr, int count)
{
int crc;
char i;
crc = 0;
while (--count >= 0)
{
crc = crc ^ (int) *ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
} while(--i);
}
return (crc);
}
...
-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
> wenn mir jemand auf die Sprünge helfen könnte.
Die 24 Schleifendurchlaeufe schaffst Du manuell locker in einer
Viertelstunde bzw. man fuege an geeigneten Stellen ein stdio.h-include,
ein main() sowie ein paar printf's hinein.
Reicht das fuer den Sprung?
VG,
Hans
Hi zusammen,
>Reicht das fuer den Sprung?
@Hans: Der war für den Anfang etwas zu hoch:-)
Shit, ich kapier´s einfach nicht...Echt deprimierend!
Was meinst du mit dem (1) in...
> Polynom XModem=(1)0001000000100001
Ich versteh das Prinzip nicht...Oje!
Gruß und nochmal Danke für die Antworten!
>Was meinst du mit dem (1) in...>> Polynom XModem=(1)0001000000100001
Das ist die X^16, welche i.d.R. weggelassen wird. Wenn Du es haendisch
rechnet, muss die fuehrende Eins hingeschrieben werden.
Die naechsten "1" sind X^12, X^5 und X^0.
1 exor 1 = 0 .... right!??
Im der Routine erkennt man den Trick daran, dass das MSB Bit auf "1"
getestet
wird, diese "1" exor der MSB-Polynom-(1) ist... = 0, also brauchen wir
diese nicht mehr hinschreiben (oder dafuer Speicherplatz verbrauchen).
Daher steht nur exor 0x1021 im Programm, weil wir wissen, dass Bit 16
auf 0 reduziert wird.
VG,
Hans
Hi Hans,
danke für die Antwort. ich glaube ich steig langsam etwas besser durch.
Dann muss ich also die 15 Nullen bei der Berechnung per Hand weglassen?!
OK...
Nutzdaten A90064 --> 1010 1001 0000 0000 0110 0100
Polynom 0x1021 --> 1 0001 0000 0010 0001
Berechnung dann ganz normal, also so...?
1010 1001 0000 0000 0110 0100
1000 1000 0001 0000 1
---------------------------------
010 0001 0001 0000 1
.
.
.
.
.
Grafisch könnte man das ja mit Schieberegister darstellen. Also bei
0x1021 dann so (siehe Anhang). Im Schiebe Register entstehen die CRC
Bits, die dann am Ende des Byteblocks durch Umlegen des Schalters
"ausgetaktet" bzw. nachgeschoben werden, oder?
Grüße
>Berechnung dann ganz normal, also so...?
genau.
>..., die dann am Ende des Byteblocks durch Umlegen des Schalters> "ausgetaktet" bzw. nachgeschoben werden, oder?
Im Prinzip ja ;-) Aber da steht in einschlaegigen Buechern eine Menge
mehr dazu... (Teufel+Detail und so :-)
VG,
Hans
So ein Schmarrn! Wenn man im tgif "Snap to Grid" ausschaltet,
kann man bei Winz-Zeichnungen wesentlich freier gestalten.
Man moege mir bitte das vorher unrichtige 5kB PNG verzeihen!
VG,
Hans