Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » CRC16 - funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.03.2008, 07:12 Uhr
~tomtom
Gast


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.


C++:
#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.

Tomtom

Dieser Post wurde am 23.03.2008 um 10:40 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.03.2008, 10:45 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
das dir das nicht abschmiert ist eigentlich ein Wunder.

(unsigned char *)201400 <-- hiermit greifst du auf die speicheradresse 201400 zu, was da drin steht ist undefiniert (in deinem Fall wohl glücklicherweise 0)! du meintest sicherlich

crc16("201401", 6);

wobei eigentlich die dataP-Variable in der Funktion const sein müsste und sollte.

char wert_crc = crc16 <-- rückgabetyp von crc16 ist unsigned int, deine char-Variable ist da viel zu klein den Wert aufzunehmen!

Was benutzt du denn für einen Compiler? Jeder anständige Compiler müsste zumindest letzteres als Warnung ausspucken?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.03.2008, 14:03 Uhr
~tomtom
Gast


Hallo,

also Compiler setzte ich auf "MinGW".

Fehler erhalte ich keinen.

Nun habe ich es mal abgeändert...also wie du es vorgeschlagen hast

C++:
int main() {
    char wert_crc  = crc16("201400",6);
    printf("CRC16 ist %d\n", wert_crc);
    system("PAUSE");
    return 0;
}



da bekomme ich folgendes:
Software\CRC32\c\Untitled1.cpp invalid conversion from `const char*' to `unsigned char*'
Software\CRC32\c\Untitled1.cpp initializing argument 1 of `unsigned int crc16(unsigned char*, unsigned char)'

Viele Grüße
tomtom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.03.2008, 14:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja der mingw ist schon relativ alt (gcc 3.3 oder sowas)


C++:
unsigned int crc16(const unsigned char *dataP, unsigned char n) // <- da muss das const rein




C++:
int main() {
    unsigned int wert_crc  = crc16("201400",6); // das char vorne muss ein unsigned int sein! sonst ist die Variable zu klein!
    printf("CRC16 ist %04X\n", wert_crc); // für 4stellige Hex-Ausgabe %04X benutzen, sonst kriegst du dezimalwert mit %d
    getchar(); // system("PAUSE"); ist bad, siehe FAQ-Eintrag zu "system"
    return 0;
}



Ansonsten // ist nur bei C++ und ab C90 erlaubt, das "alte" C kennt nur /* */

Es gibt so zwar mit -Wall und -pedantic eine signed/unsigned warnung, da "201400" eigentlich "const signed char *" ist, aber das konvertiert er automatisch.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: