Forum: Mikrocontroller und Digitale Elektronik CRC-16: Ergebnis der Summenbildung


von Sven Scholz (Gast)


Lesenswert?

Guten Tag,

ich habe eine CRC-16 (x16 + x12 + x5 + 1) Prüfsummenbildung in meine 
Applikation eingebunden.

Jetzt würde ich gerne Gegentesten, ob die mit der Routine gebildete 
Prüfsumme auch wirklich stimmt.

Beispiel:
CRC-16 über einen Speicherblock. (32-Bit Wortbreite)
Speicherbereich: 0x00000000 - 0x001FFFFF)
An allen Speicherstellen steht das Muster: 0x55555555


Wenn ich meine CRC16-Routine darauf jetzt ansetze, bekomme ich als 
Prüfsumme ein 0x0000015D heraus. Glaube nicht, dass das stimmt...

Arbeite hierbei mit einer LookUp-Tabelle:

const unsigned int crc16_table[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78};


Die eigtl. Bildung geschieht mit folgender Codezeile:

crc = (crc >> 8) ^ crc16_table[tmp ^ (crc & 0xff)];


Hat jemand eine Anmerkung für mich. DANKE.
Gibts vielleicht sogar eine Freeware, wo ich solche Daten testen kann?

Nochmal DANKE.

von Markus S. (watermax)


Lesenswert?

Bei Wiki gibts ein paar Weblinks zur Online Berechnung

http://de.wikipedia.org/wiki/Cyclic_Redundancy_Check


Ansonsten kannst du es mit den beiden folgenden Formeln, die ohne 
Tabellenzugriffe arbeiten testen:
1
u16 CRC_XMODEM( u8* pData, u16 crc){
2
crc = crc ^ (u16)*pData++;
3
for(u8 i = 0; i < 8 ; i++){
4
    if(crc & 0x8000)  crc = (crc << 1) ^ 0x1021;
5
    else      crc <<= 1;
6
       }
7
return crc;
8
}

oder
1
u16 CRC_CCITT( u8* pData, u16 crc){
2
crc = (u8)(crc >>  8) | (crc << 8);
3
crc ^= *pData++ ^ (u8)(crc) >> 4;
4
crc ^= (crc << 8) << 4;
5
crc ^= ((crc & 0xff) << 4) << 1;
6
  return crc;
7
}

von Timmo H. (masterfx)


Lesenswert?

Es gibt ein gutes Tool was unzählige Hash und Checksummen-Algos 
beherrscht. Nennt sich JackSum, einfach mal googeln

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.