CRC16
-
Hallo,
ich bin leider erst am Anfang und habe noch nicht wirklich viel Ahnung/erfahrung mit C...
Momentan ärgere ich mich mit einer CRC16 funktion rum. Die liefert mir als CRC-wert immer 0
Anbei mal der Code...die CRC-Funktion sollte stimmen. Die habe ich so im netz gefunden.#include<stdio.h> #include<stdlib.h> // *dataP is a pointer to the byte array over which the CRC is to be calculated // n is the number of bytes in the array pointed to by *dataP // unsigned int crc16( unsigned char * dataP, unsigned char n ) { unsigned char i, j; // byte counter, bit counter unsigned int crc_16; // calculation crc_16 = 0x0000; // PRESET value for (i = 0; i < n; i++) // check each byte in the array { crc_16 ^= *dataP++; // for (j = 0; j < 8; j++) // test each bit in the byte { if(crc_16 & 0x0001 ) // { crc_16 >>= 1; crc_16 ^= 0x8408; // POLYNOMIAL x^16 + x^12 + x^5 + 1 } else { crc_16 >>= 1; } } } return( crc_16 ); // returns calculated crc (16 bits) } int main() { char wert_crc = crc16((unsigned char *)201400,6); printf("CRC16 ist %d\n", wert_crc); system("PAUSE"); return 0; }
Für den String/Wert "201401" (natürlich ohne "") sollte der CRC "E043" sein.
Vielleicht kann mir jemand weiterhelfen?!
Vielen Dank für eure Mühe und frohe Ostern.
Tomtim
-
ohne den Code wirklich durchgeschaut zu haben: warum speicherst du das Ergebnis des Aufrufs in einem char?
-
Sofern du echte Daten nimmst und nicht nur eine zufällige Speicheradresse, hast Du wenigstens die Chance, dass es funktioniert:
int main( void ) { unsigned char data[ ] = "201400"; printf( "CRC16 von \"%s\" ist 0x%x\n", data, crc16( data, sizeof( data ) - 1 ) ); }
Woher hast du das Ergebnis für "201401"? Ist nämlich Quatsch:
CRC-16 0xF0DE CRC-16 (Modbus) 0xEBDE CRC-16 (Sick) 0x46B8 CRC-CCITT (XModem) 0xC8FD CRC-CCITT (0xFFFF) 0xC6ED CRC-CCITT (0x1D0F) 0xF9C3 CRC-DNP 0x3555
Eigentlich geht's kurz und schmerzlos:
unsigned short crc16_ccitt( unsigned char *src, unsigned short initial_crc ) { unsigned short crc = initial_crc; while( *src ) { crc = ( crc >> 8 ) | ( crc << 8 ); crc ^= *src++; crc ^= ( crc & 0xf0 ) >> 4; crc ^= crc << 12; crc ^= ( crc & 0xff ) << 5; } return crc; }
greetz, Swordfish
-
Hallo Zusammen,
vielen Dank für eure Hilfe :))
Swordfish schrieb:
Woher hast du das Ergebnis für "201401"? Ist nämlich Quatsch:
ich habe den Wert aus einem anderen Programm....der errechnet den so.
Das ganze steht in einem PDF...auf Seite 11. Da stehen beispiele und auch der C-Source. Das PDF hab ich hier hochgeladen:
http://rapidshare.com/files/101709754/New_SkyeTek_Protocol_S11.pdf.htmlViele Grüße
Tomtim
-
Confidential
The contents of this document are confidential and proprietary to SkyeTek, Inc. and may
not be reproduced, transmitted, published, or disclosed to others without prior
authorization.*rofl*
Für mich lieferd die CRC Funktion aus dem PDF keine korrekten Ergebnisse. Wenn jedoch von SkyeTek empfohlen wird, sie zu benutzen (und du Lizenznehmer bist) dann frag' mal bei SkyeTek nach.
greetz, Swordfish
-
Swordfish schrieb:
Confidential
The contents of this document are confidential and proprietary to SkyeTek, Inc. and may
not be reproduced, transmitted, published, or disclosed to others without prior
authorization.*rofl*
das file gibts öffentlich im netz...
Aber danke für den Tipp..ich werd mal schauen was ich mach!
Grüße
tomtim
-
Swordfish schrieb:
Für mich lieferd die CRC Funktion aus dem PDF keine korrekten Ergebnisse.
und das soll heissen?
-
crc-freak schrieb:
Swordfish schrieb:
Für mich lieferd die CRC Funktion aus dem PDF keine korrekten Ergebnisse.
und das soll heissen?
daß Swordfish keine Ahnung hat, was ein CRC überhaupt ist.
-
Jaja ihr Freaks, ist schon klar...
greetz, Swordfish
-
Swordfish schrieb:
Jaja ihr Freaks, ist schon klar...
deine ahnungslosigkeit ist offensichtlich, denn sonst hättest du dich nicht so abfällig über den CRC-code aus dem PDF da^^ geäussert. ein speed-optimierter code mit dem gleichen generatorpolynom sieht übrigens so aus:
/* CRC16 implementation acording to CCITT standards */ static const unsigned int crc_tab[16] = { 0x0000, 0x1081, 0x2102, 0x3183, 0x4204, 0x5285, 0x6306, 0x7387, 0x8408, 0x9489, 0xA50A, 0xB58B, 0xC60C, 0xD68D, 0xE70E, 0xF78F }; unsigned short crc_update (unsigned short crc, unsigned char c) { crc = (((crc >> 4) & 0x0FFF) ^ crc_tab[((crc ^ c) & 0x000F)]); crc = (((crc >> 4) & 0x0FFF) ^ crc_tab[((crc ^ (c>>4)) & 0x000F)]); return crc; }
...und der spuckt exakt das selbe aus, das der code aus dem PDF auch tut.