CRC8 und CRC32 in C

OP #1462105
Lesenswert?

weil hier alle paar Wochen ein Hilferuf nach CRC Berechnung gepostet 
wird, habe ich mal meine erprobten CRC Routinen zu einem lauffähigen 
Testprogramm zusammengefasst.
Hier der CRC8 und der CRC32 (kompatibel zum Ethernet CRC32) in C.
Der CRC8 eignet sich für kurze Datensätze die selten gesendet werden, 
wie z.B. kurze Fernsteuerkommandos, Fernthermometer oder ähnliches.
Für Daten die mit größerer Geschwindigkeit übertragen werden, ist der 
CRC32 besser.
Die Programme sind simpel, nicht optimiert, aber für uC Anwendungen an 
der seriellen Schnittstelle mehr als schnell genug. Bei mir laufen sie 
auf Atmel uCs.

Die angehängten Programme können so wie sie sind compiliert und in einer 
Konsole ausgeführt werden. Man kann den Code direkt in eine eigene 
Applikation übernehmen, main() läßt man natürlich weg, aber in main() 
kann man nachsehen wie die CRC Berechnung aufgerufen wird.

Vielleicht will jemand noch seinen CRC16 Code hier posten ? Dann hätten 
wir alles komplett.

viele Grüße
Kurt
Angehängte Dateien:
Gast #2264331
Lesenswert?

Hi,
ich benutze Cosmic-Compiler, und meine frage lautet ob die gepostete 
Quellcode "CRC8_v2.c" benutzen kann ohne es zu ändern.Im Doc. von 
Cosmic-Compiler steht es schon funktionen "_checksum8()".
"_checksum16()","_checksumx()"..usw.

aber die Beispiele sind dann dort von einem Linker Beispiele, die ich 
nicht verstehe.

ich wäre Dankbar für jeden Tip.

Gruß
Gast #2443199
Lesenswert?

Hi, ich habe mal den CRC32 C-Code getestet.
1
// ProjektCRC32.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
2
//
3

4
#include "stdafx.h"
5
#include <stdio.h>
6

7
unsigned long reg32 = 0xffffffff;     // Schieberegister
8
 
9
unsigned long crc32_bytecalc(unsigned char byte)
10
{
11
  int i;
12
  unsigned long polynom = 0xEDB88320;    // Generatorpolynom
13

14
    for (i=0; i<8; ++i)
15
  {
16
        if ((reg32&1) != (byte&1))
17
             reg32 = (reg32>>1)^polynom; 
18
        else 
19
             reg32 >>= 1;
20
    byte >>= 1;
21
  }
22
  return reg32 ^ 0xffffffff;       // inverses Ergebnis, MSB zuerst
23
}
24

25
unsigned long crc32_messagecalc(unsigned char *data, int len)
26
{
27
  int i;
28

29
  for(i=0; i<len; i++) 
30
  {
31
    crc32_bytecalc(data[i]);    // Berechne fuer jeweils 8 Bit der Nachricht
32
  }
33
  return reg32 ^ 0xffffffff;
34
}
35

36
int _tmain(int argc, _TCHAR* argv[])
37
{  
38
  unsigned char data1[] = {"123456789"};
39
  unsigned long crc32;
40

41
  reg32 = 0xffffffff;          // Initialisiere Shift-Register mit Startwert
42
  crc32 = crc32_messagecalc(data1,9);
43
  printf("1: CRC32 = %lx\n",crc32);
44

45
  unsigned char data2[] = {"123456789"};
46

47
  reg32 = 0xffffffff;          // Initialisiere Shift-Register mit Startwert
48
  crc32 = crc32_messagecalc(data2,9);
49
  printf("2: CRC32 = %lx\n",crc32);
50
  
51
  return 0;
52
}

Wenn ich nun die Daten auf der Webseite von 
"http://www.zorc.breitbandkatze.de/crc.html"; eingebe, dann komme ich 
nicht auf das Ergbnis: 0xCBF43926.

Was habe ich bei der EIngabe auf der Webseite falsch gemacht ?
Angehängte Dateien:

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